Reverse proxy đứng trước backend để nhận request rồi chuyển tới đúng ứng dụng phía sau. Bài viết giải thích vai trò của Nginx, lỗi 502 và checklist cơ bản cho người mới dùng VPS.
Khi vận hành một máy chủ, bạn có thể muốn chạy nhiều trang web hoặc ứng dụng trên cùng một địa chỉ IP. Hoặc đôi khi, bạn chỉ muốn giấu cổng mạng nội bộ của ứng dụng khỏi thế giới bên ngoài. Đó là lúc bạn cần hiểu reverse proxy là gì và cách nó hoạt động. Đây là một lớp thường gặp trong kiến trúc VPS.
Nói gọn: Reverse proxy là một máy chủ trung gian đứng trước một hoặc nhiều backend. Nó làm nhiệm vụ nhận các yêu cầu (request) từ client (người dùng) rồi chuyển đến đúng backend phù hợp ở phía sau.
Để dễ hình dung, hãy tưởng tượng reverse proxy như một nhân viên lễ tân của tòa nhà văn phòng. Khi khách đến, họ không tự đi tìm phòng ban mà sẽ gặp lễ tân trước. Lễ tân ghi nhận yêu cầu, liên hệ đúng phòng ban ở phía sau, lấy kết quả và mang ra trả cho khách. Khách không cần biết sơ đồ tòa nhà, và phòng ban bên trong cũng không phải trực tiếp tiếp khách lạ.
Trong kỹ thuật, reverse proxy đại diện cho server để nhận traffic từ bên ngoài. Máy chủ thực sự xử lý dữ liệu (backend) có thể chỉ lắng nghe ở địa chỉ nội bộ 127.0.0.1 trên một cổng nào đó, ví dụ 127.0.0.1:3000 — máy khác trên Internet gõ thẳng vào cũng không tới được. Khi đó, backend không cần mở trực tiếp cổng public. Reverse proxy sẽ đứng ra nhận traffic, sau đó chuyển tiếp qua mạng nội bộ cho backend xử lý.
Nghe thì chỉ là chuyển tiếp dữ liệu qua lại. Nhưng cấu hình tử tế, reverse proxy gánh hộ bạn khá nhiều việc. Vậy reverse proxy dùng để làm gì?
blog.example.com ở cổng 3000 và shop.example.com ở cổng 8080. Reverse proxy nhìn vào tên miền hoặc đường dẫn rồi chuyển request tới đúng ứng dụng.Rất nhiều người mới thường nhầm lẫn các khái niệm mạng này với nhau. Khi nói về reverse proxy và forward proxy, điểm khác biệt lớn nhất nằm ở hướng đại diện. Nếu như forward proxy đại diện cho client đi ra ngoài internet để che giấu danh tính người dùng, thì reverse proxy lại đại diện cho server nhận traffic từ bên ngoài để bảo vệ hệ thống bên trong.
Ngoài ra, reverse proxy không đồng nghĩa với WAF (Web Application Firewall) hay tường lửa firewall VPS thông thường. Dù nó có thể là một phần của hệ thống bảo mật, nó không tự động có chức năng chống DDoS. Bạn có thể tham khảo thêm sự khác nhau giữa WAF và Firewall để hiểu rõ hơn.
Tương tự, một máy chủ proxy cũng không mặc định là một load balancer (cân bằng tải) nếu bạn không cấu hình luật phân bổ lưu lượng cụ thể cho nó.
CDN là mạng nhiều điểm đặt gần người dùng để phân phối nội dung tĩnh. Reverse proxy là trạm đứng trước backend của chính bạn; CDN có thể dùng reverse proxy bên trong, nhưng tự dựng reverse proxy chưa biến nó thành CDN. Xem thêm CDN là gì.
Trên VPS, nhiều người chọn Nginx cho việc này. Nginx nhận request ở lớp public rồi chuyển tiếp tới backend theo cấu hình. Xem thêm bài Cloud VPS là gì.
Thông thường, Nginx nhận các public port 80 (HTTP) và 443 (HTTPS) để đón khách. Chìa khóa để Nginx trung chuyển là chỉ thị proxy_pass, dùng để chuyển request tới HTTP server hoặc ứng dụng ở địa chỉ và cổng trong mạng nội bộ.
Ví dụ tối giản:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Host giữ tên miền khách gõ; hai header IP báo cho backend biết request đi qua proxy và IP gốc. Khi dùng thật, thay tên miền và cổng ví dụ bằng giá trị của ứng dụng.
Để một website hoạt động trơn tru qua hệ thống này, dữ liệu sẽ đi qua một luồng nhất định.
Đầu tiên, hệ thống DNS chỉ làm nhiệm vụ trỏ tên miền tới địa chỉ IP của lớp public. Bản thân DNS không thể tự cấu hình reverse proxy cho bạn.
Khi người dùng gõ tên miền, yêu cầu đi tới Nginx. Nginx sẽ kiểm tra cấu hình, xác định backend tương ứng rồi dùng đường truyền nội bộ đẩy dữ liệu vào. Backend xử lý xong, gửi phản hồi (response) lại cho Nginx, và Nginx trả kết quả cuối cùng cho trình duyệt của người dùng.
Trong quá trình vận hành, bạn sẽ đôi lần gặp lỗi 502 Bad Gateway. Lỗi 502 thường cho biết gateway hoặc proxy nhận phản hồi không hợp lệ từ upstream (tức là backend). Bind là địa chỉ mà ứng dụng chịu lắng nghe; hãy kiểm tra ứng dụng, cổng và địa chỉ 127.0.0.1 có khớp không. Với Nginx, dòng báo lỗi thường nằm trong /var/log/nginx/error.log. Hai header X-Forwarded-For và X-Real-IP báo IP gốc của khách; Host cho backend biết tên miền khách đã gõ. Thiếu chúng, log, thống kê hoặc cơ chế chặn IP có thể nhận sai thông tin.
Đôi khi, lỗi xảy ra do timeout. Khi backend xử lý quá lâu, kết nối có thể bị cắt đứt. Hãy kiểm tra proxy_read_timeout ở Nginx rồi đối chiếu với thời gian xử lý của ứng dụng. Tình trạng này dễ làm website trên VPS bị chậm hoặc báo lỗi.
Ứng dụng chat hoặc thông báo realtime dùng WebSocket cần proxy chuyển tiếp header Upgrade và Connection. Upload file lớn cần xem client_max_body_size; nếu giới hạn nhỏ hơn file, Nginx có thể trả lỗi 413. Request xử lý lâu cần proxy_read_timeout đủ dài để backend trả xong.
Mở trực tiếp cổng của các ứng dụng backend ra Internet sẽ tạo thêm cửa để người lạ dò quét. Vì vậy, chỉ nên mở public port cần thiết tại proxy và để backend lắng nghe ở mạng nội bộ khi kiến trúc cho phép.
Reverse proxy cũng có thể trở thành đơn điểm lỗi (Single Point of Failure) hoặc nút nghẽn cổ chai. Nếu máy chủ Nginx bị sập, mọi ứng dụng phía sau dù đang hoạt động tốt cũng sẽ không thể truy cập được. Hãy đặt cảnh báo khi proxy không trả lời và tránh nhét cả proxy lẫn database vào một máy đã đầy tài nguyên.
Dưới đây là bảng tổng hợp nhanh để bạn dễ dàng ra quyết định khi thiết kế hệ thống:
| Tình huống | Nên dùng Reverse Proxy? | Lý do |
|---|---|---|
| Chạy nhiều website trên 1 VPS | Có | Dễ dàng định tuyến theo tên miền trên cùng IP |
| Cài đặt chứng chỉ SSL tập trung | Có | Giảm tải mã hóa cho backend, dễ quản lý chứng chỉ |
| Giấu cổng ứng dụng nội bộ | Có | Ngăn chặn việc truy cập trực tiếp qua mạng bên ngoài |
| Môi trường dev nội bộ đơn giản | Không | Gây thêm độ phức tạp không cần thiết cho ứng dụng |
127.0.0.1:<port> hoặc mạng nội bộ cần thiết, không mở 0.0.0.0 nếu không có lý do.Host, X-Real-IP và X-Forwarded-For.proxy_read_timeout đủ dùng.Upgrade và Connection.client_max_body_size.Không. Apache, HAProxy, Caddy và Traefik đều có thể làm reverse proxy. Nếu hệ thống đang dùng Nginx, giữ công cụ quen thuộc thường dễ bảo trì hơn.
Lỗi này xảy ra khi proxy không nhận được phản hồi hợp lệ từ backend. Bạn nên kiểm tra xem backend có đang bị sập, quá tải, hoặc sai cổng kết nối trong cấu hình hay không.
Proxy thêm một trạm trung chuyển nên có thể tăng một phần độ trễ. Với nội dung tĩnh được cache, backend bớt phải xử lý request lặp lại; với nội dung động, hãy đo trước và sau khi thêm proxy.
Nginx có thể giới hạn kết nối để giảm thiểu các đợt tấn công nhỏ, nhưng nó không phải là giải pháp chuyên dụng như các tường lửa lớp mạng hoặc WAF.
Chỉ thị này phù hợp để chuyển tiếp HTTP/HTTPS tới ứng dụng web trên VPS, chẳng hạn app Node.js, Python hoặc Java. Backend dùng giao thức khác HTTP cần cơ chế proxy phù hợp với giao thức đó.
Nắm được nguyên lý rồi thì mỗi lần thêm một site mới lên VPS, bạn đỡ phải mò. Reverse proxy đóng vai trò như người gác cổng và phân luồng, giúp backend tập trung vào logic chính.
Nếu cần một máy chủ ảo để đặt reverse proxy và backend, bạn có thể tham khảo các gói Cloud VPS tại cloudmoon.net. Với vài website nhỏ, hãy bắt đầu từ gói thấp rồi theo dõi tài nguyên để biết lúc nào cần tăng.
Chưa có bình luận nào. Hãy là người đầu tiên!