Skip to content
VDS · Website và máy chủ web

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ứngNguyê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ỗiclient_max_body_size quá nhỏ; mặc định là 1 MB
Cùng một IP trong nhật ký ứng dụngX-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.1 không cần mã hóa — chúng không bao giờ rời khỏi máy.