0

Forward Proxy vs Reverse Proxy Architecture trong Node.js

Chào anh em Viblo,

Trong các buổi phỏng vấn backend, câu hỏi về Forward ProxyReverse Proxy thường xuất hiện vì chúng là nền tảng quan trọng trong kiến trúc hệ thống. Tuy nhiên, nhiều ứng viên dễ nhầm lẫn giữa hai khái niệm này. Bài viết này sẽ giúp bạn phân biệt rõ ràng, kèm ví dụ thực tế bằng Node.js.


Forward Proxy – Đại diện cho Client

  • Khái niệm: Forward Proxy nằm trước client. Khi bạn gửi request đến một website, request sẽ đi qua proxy trước rồi mới ra internet.
  • Ví dụ thực tế: Giống như một trợ lý cá nhân. Bạn nhờ họ đi mua hàng, cửa hàng chỉ thấy trợ lý chứ không thấy bạn.
  • Ứng dụng:
    • Ẩn IP thật của client (anonymity).
    • Lọc nội dung (ví dụ: chặn Facebook/Netflix trong trường học).
    • Kiểm soát truy cập internet.

Demo Node.js: Tạo một forward proxy đơn giản xử lý HTTP/HTTPS request bằng httpnet.

// forward-proxy/server.js
const http = require('http');
const net = require('net');
const url = require('url');
const PORT = 8080;
const server = http.createServer((req, res) => {
  // Handle standard HTTP requests...
  // (Full code in repo)
});
// Handle HTTPS (CONNECT method)
server.on('connect', (req, clientSocket, head) => {
  const { port, hostname } = url.parse(`//${req.url}`, false, true);
  const serverSocket = net.connect(port || 443, hostname, () => {
    clientSocket.write('HTTP/1.1 200 Connection Established\r\n\r\n');
    serverSocket.write(head);
    serverSocket.pipe(clientSocket);
    clientSocket.pipe(serverSocket);
  });
});
server.listen(PORT, () => console.log(`Forward Proxy running on port ${PORT}`));

Reverse Proxy – Đại diện cho Server

  • Khái niệm: Reverse Proxy nằm trước server. Khi bạn truy cập Amazon.com, thực tế bạn nói chuyện với proxy, proxy sẽ quyết định backend nào xử lý request.
  • Ví dụ thực tế: Giống như một lễ tân công ty. Bạn gọi số tổng đài, lễ tân sẽ chuyển bạn đến đúng phòng ban.
  • Ứng dụng:
    • Load balancing: phân phối request giữa nhiều server.
    • Bảo mật: ẩn IP backend.
    • SSL termination: proxy xử lý mã hóa/giải mã HTTPS.

Demo Node.js: Reverse proxy với load balancing round-robin giữa 2 backend servers.

// reverse-proxy/proxy-server.js
const http = require('http');
const PORT = 3000;
const BACKENDS = [
  { host: 'localhost', port: 3001 },
  { host: 'localhost', port: 3002 }
];
let currentBackend = 0;
const server = http.createServer((req, res) => {
  // Simple Round-Robin Load Balancing
  const target = BACKENDS[currentBackend];
  currentBackend = (currentBackend + 1) % BACKENDS.length;
  console.log(`Routing to Backend: ${target.port}`);
  const options = {
    hostname: target.host,
    port: target.port,
    path: req.url,
    method: req.method,
    headers: req.headers,
  };
  const proxyReq = http.request(options, (proxyRes) => {
    res.writeHead(proxyRes.statusCode, proxyRes.headers);
    proxyRes.pipe(res, { end: true });
  });
  req.pipe(proxyReq, { end: true });
});
server.listen(PORT, () => console.log(`Reverse Proxy listening on ${PORT}`));

So sánh nhanh

Đặc điểm Forward Proxy (Client-side) Reverse Proxy (Server-side)
Đại diện cho Client Server
Mục đích chính Ẩn danh, kiểm soát truy cập Load balancing, bảo mật
Ví dụ thực tế Trợ lý cá nhân Lễ tân công ty

Công cụ phổ biến

  • Reverse Proxy: Nginx, HAProxy, Caddy, Traefik.
  • Forward Proxy: Squid, Privoxy, Tinyproxy.

Kết luận

Hiểu rõ sự khác biệt giữa Forward Proxy và Reverse Proxy không chỉ giúp bạn trả lời tốt trong phỏng vấn mà còn là kỹ năng quan trọng khi thiết kế hệ thống backend. Node.js là môi trường tuyệt vời để thử nghiệm và học hỏi các kiến trúc này trước khi áp dụng các công cụ production như Nginx hay HAProxy.


Tham khảo


Đọc thêm các bài viết liên quan


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí