Nginx reverse proxy: đặt cổng trước ứng dụng backend của bạn

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Ứng dụng Node.js, Python hay Java của bạn thường chạy ở một cổng như 3000 hoặc 8000, không ai muốn gõ số cổng vào địa chỉ web. Nginx đứng phía trước làm 'lễ tân', nhận mọi yêu cầu ở cổng 80 và 443 rồi chuyển vào đúng ứng dụng phía sau. Đó là reverse proxy.

Reverse proxy là gì và vì sao nên dùng?

Reverse proxy là máy chủ trung gian nhận yêu cầu từ người dùng và chuyển tiếp tới các máy chủ bên trong. Người dùng chỉ biết địa chỉ của proxy, không thấy ứng dụng thật. Lợi ích:

  • Một cổng cho nhiều ứng dụng: phân biệt theo tên miền hoặc đường dẫn.
  • Xử lý HTTPS tập trung: ứng dụng bên trong chỉ cần chạy HTTP đơn giản.
  • Phục vụ file tĩnh hiệu quả, giảm tải cho ứng dụng.
  • Cân bằng tải giữa nhiều bản sao ứng dụng.
  • Thêm lớp bảo vệ: giới hạn kích thước, tốc độ yêu cầu.

Cấu hình tối thiểu

Giả sử ứng dụng chạy ở cổng 3000 trên cùng máy. Tạo file cấu hình, thường ở /etc/nginx/sites-available/app.conf (hoặc /etc/nginx/conf.d/ tùy bản phân phối):

server {
    listen 80;
    server_name example.com;

    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;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Các dòng proxy_set_header rất quan trọng: nếu thiếu, ứng dụng sẽ chỉ thấy mọi yêu cầu đến từ 127.0.0.1 và không biết tên miền hay địa chỉ thật của khách.

Kiểm tra và áp dụng cấu hình

sudo nginx -t
sudo systemctl reload nginx

Luôn chạy nginx -t trước. Lệnh này kiểm tra cú pháp mà không ảnh hưởng dịch vụ đang chạy. Dùng reload thay cho restart để áp dụng cấu hình mới mà không ngắt kết nối hiện có.

Chia theo đường dẫn

location /api/ {
    proxy_pass http://127.0.0.1:3000/;
}

location / {
    root /var/www/frontend;
    try_files $uri /index.html;
}

Cấu hình trên chuyển mọi yêu cầu bắt đầu bằng /api/ sang backend, còn lại phục vụ giao diện tĩnh. Chú ý dấu / ở cuối trong proxy_pass vì nó thay đổi cách Nginx ghép đường dẫn. Đây là chỗ nhiều người sai, nên hãy thử kỹ bằng curl.

Cân bằng tải đơn giản

upstream backend_app {
    server 127.0.0.1:3001;
    server 127.0.0.1:3002;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend_app;
    }
}

Mặc định Nginx chia yêu cầu luân phiên giữa các máy chủ trong khối upstream. Đây cũng là nền tảng cho rolling update và mở rộng ngang.

Lỗi thường gặp

  1. 502 Bad Gateway: Nginx không kết nối được ứng dụng phía sau. Kiểm tra ứng dụng đã chạy chưa và đúng cổng chưa.
  2. 504 Gateway Timeout: ứng dụng trả lời quá chậm. Xem lại hiệu năng trước khi tăng thời gian chờ.
  3. Mất địa chỉ IP thật của khách: thiếu các dòng proxy_set_header.
  4. WebSocket không hoạt động: cần thêm các header nâng cấp kết nối (Upgrade và Connection) và dùng HTTP/1.1.

Log nằm ở /var/log/nginx/error.log và access.log; hãy dùng tail -f khi gỡ lỗi.

Kết luận

Reverse proxy bằng Nginx là kỹ năng nền tảng khi đưa ứng dụng lên máy chủ thật. Bạn chỉ cần nhớ ba thứ: proxy_pass, các header chuyển tiếp, và thói quen chạy nginx -t trước khi reload.

Nếu bạn muốn đưa một dự án hoàn chỉnh lên VPS từ A đến Z, hãy xem lộ trình học tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment