Reverse proxy: nhiều ứng dụng trên một địa chỉ
Cách chia sẻ một địa chỉ VDS công khai giữa nhiều ứng dụng theo tên miền và đường dẫn, truyền header đúng cách, và không làm hỏng WebSocket.
Cập nhật 23 tháng 8, 2026
Một máy chỉ có một địa chỉ IPv4 công khai, nhưng thường chạy nhiều ứng dụng. Reverse proxy nhận mọi yêu cầu trên cổng 80 và 443 rồi định tuyến chúng đến các dịch vụ nội bộ theo tên miền hoặc đường dẫn. Nó cũng giữ chứng chỉ duy nhất và nhật ký dùng chung.
Bố cục
Mỗi ứng dụng lắng nghe trên cổng nội bộ riêng và chỉ trên 127.0.0.1:
- trang frontend —
127.0.0.1:3000; - API —
127.0.0.1:8000; - bảng điều khiển giám sát —
127.0.0.1:9090.
Chỉ Nginx được mở ra bên ngoài. Để kiểm tra một ứng dụng không bị lộ trực tiếp:
ss -tulpn | grep LISTEN
Những dòng như 0.0.0.0:3000 nghĩa là dịch vụ có thể truy cập từ internet, bỏ qua proxy và không có mã hóa.
Theo tên miền
server {
listen 80;
server_name app.example.ru;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name api.example.ru;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Nếu không có X-Forwarded-For, ứng dụng sẽ thấy mọi yêu cầu đều đến từ 127.0.0.1, và mọi giới hạn dựa trên IP đều ngừng hoạt động.
Theo đường dẫn
location /api/ {
proxy_pass http://127.0.0.1:8000/;
}
Dấu gạch chéo ở cuối trong proxy_pass rất quan trọng ở đây: có nó, tiền tố /api bị cắt bỏ và ứng dụng nhận được /users; không có nó, ứng dụng nhận được /api/users. Một nửa trong số mọi “lỗi 404 bí ẩn” trên proxy đến chính từ điều này.
WebSocket và phản hồi dài
location /ws/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
}
Nếu không có cặp Upgrade/Connection, kết nối sẽ đứt ngay sau bắt tay; nếu không tăng timeout, nó sẽ đứt sau một phút im lặng.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân |
|---|---|
502 Bad Gateway | Ứng dụng không chạy hoặc lắng nghe trên cổng khác |
504 Gateway Time-out | Ứng dụng phản hồi lâu hơn proxy_read_timeout |
| Chuyển hướng vô hạn | Ứng dụng không biết về HTTPS — hãy truyền X-Forwarded-Proto |
| Tải tệp lên bị lỗi | client_max_body_size quá nhỏ; mặc định là 1 MB |
| Cùng một IP trong nhật ký ứng dụng | X-Forwarded-For không được truyền |
Tiếp theo: nhiều site, chứng chỉ, Caddy với HTTPS tự động.
Một chứng chỉ trên proxy bao phủ mọi ứng dụng phía sau nó. Các kết nối nội bộ qua
127.0.0.1không cần mã hóa — chúng không bao giờ rời khỏi máy.