Hướng Dẫn Cài Đặt Nginx Reverse Proxy Trên VPS Chi Tiết 2026

📅 06/2026 · ⏱ 8 phút đọc · 🏷 VPS · Nginx

Bạn chạy 3 app trên cùng 1 VPS: Node.js port 3000, Python Flask port 5000, PHP port 9000. Làm sao để cả 3 cùng chạy trên port 80/443? Đáp án: Nginx Reverse Proxy. Bài này hướng dẫn cài đặt từ con số 0 đến production-ready, kèm SSL miễn phí.

🔄 Reverse Proxy là gì? Nginx đứng trước app server của bạn, nhận request từ Internet rồi chuyển tiếp (proxy) đến backend. Client không biết backend đang chạy port nào. Lợi ích: SSL tập trung, load balancing, caching, bảo mật.

1. Cài Đặt Nginx Trên Ubuntu

sudo apt update
sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

# Kiểm tra
curl -I http://localhost
# HTTP/1.1 200 OK

Sau khi cài, mở trình duyệt vào IP VPS của bạn — bạn sẽ thấy trang welcome của Nginx.

2. Reverse Proxy Cho Node.js (Express)

Giả sử bạn có app Node.js chạy trên port 3000:

// app.js — Node.js Express
const express = require('express');
const app = express();
app.get('/', (req, res) => res.json({status: 'ok', app: 'nodejs'}));
app.listen(3000, '127.0.0.1');

Tạo Nginx config reverse proxy:

sudo nano /etc/nginx/sites-available/nodeapp

server {
    listen 80;
    server_name api.yourdomain.com;

    location / {
        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_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;
        proxy_cache_bypass $http_upgrade;
    }
}

sudo ln -s /etc/nginx/sites-available/nodeapp /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

3. Reverse Proxy Cho Python Flask / FastAPI

Flask chạy Gunicorn port 5000:

# Flask app (app.py)
# Chạy: gunicorn -w 4 -b 127.0.0.1:5000 app:app

sudo nano /etc/nginx/sites-available/flaskapp

server {
    listen 80;
    server_name flask.yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static/ {
        alias /var/www/flaskapp/static/;
        expires 30d;
    }
}

4. Reverse Proxy Cho PHP-FPM

sudo nano /etc/nginx/sites-available/phpapp

server {
    listen 80;
    server_name php.yourdomain.com;
    root /var/www/phpapp;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

5. Cấu Hình Load Balancing

Khi 1 backend không đủ, thêm nhiều instance và dùng Nginx load balancing:

sudo nano /etc/nginx/sites-available/loadbalanced

upstream node_backend {
    least_conn;  # Thuật toán: gửi request đến server ít connection nhất
    server 127.0.0.1:3000 weight=3;  # Server mạnh → weight cao
    server 127.0.0.1:3001 weight=1;
    server 127.0.0.1:3002 backup;     # Chỉ dùng khi 2 server trên die
}

server {
    listen 80;
    server_name api.yourdomain.com;

    location / {
        proxy_pass http://node_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
Thuật toánMô tảDùng khi
round-robin (mặc định)Luân phiên từng serverCác server cấu hình bằng nhau
least_connGửi đến server ít kết nối nhấtRequest có thời gian xử lý khác nhau
ip_hashCùng IP luôn đến cùng serverCần session sticky
weightPhân phối theo tỉ lệServer cấu hình không đồng đều

6. Caching Với Nginx Reverse Proxy

Cache response từ backend — giảm tải server, tăng tốc độ:

# Thêm vào http block trong /etc/nginx/nginx.conf
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

# Trong server block:
location /api/ {
    proxy_cache my_cache;
    proxy_cache_valid 200 10m;
    proxy_cache_valid 404 1m;
    proxy_cache_key "$scheme$request_method$host$request_uri";
    proxy_pass http://127.0.0.1:3000;
    add_header X-Cache-Status $upstream_cache_status;
}

7. SSL Miễn Phí Với Let's Encrypt

Bắt buộc cho production. 1 dòng lệnh:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

# Tự động gia hạn (certbot tự thêm cron)
sudo certbot renew --dry-run

Bảng So Sánh: Có vs Không Có Reverse Proxy

Tiêu chíKhông Reverse ProxyCó Nginx Reverse Proxy
Nhiều app trên 1 VPSPort khác nhau, khó nhớ1 domain/app, port 80/443
SSLCài riêng từng appTập trung 1 chỗ
Load balancingKhông cóCó sẵn
CachingPhải code trong appTích hợp sẵn
Bảo mậtApp expose trực tiếpNginx che chắn, lọc request
Rate limitingKhôngCó — limit_req

Câu Hỏi Thường Gặp

Nginx vs Apache — chọn cái nào làm reverse proxy?

Nginx nhẹ hơn, xử lý concurrent connection tốt hơn (10K connections chỉ tốn ~2.5MB RAM). Apache mạnh về .htaccess nhưng nặng hơn. Nếu chỉ làm reverse proxy: chọn Nginx.

WebSocket có qua reverse proxy được không?

Có. Chỉ cần thêm 2 header UpgradeConnection như trong phần Node.js ở trên. Đã có sẵn trong code mẫu.

Cần VPS Để Chạy Nginx Reverse Proxy?

VPS SSD NVMe, IPv4 riêng, RAM 1-4GB — đủ chạy Nginx + 3-4 backend nhẹ nhàng

Thuê VPS TrumVPS Ngay →

Xem thêm: Bảo Mật VPS Cho Người Mới · Deploy Website Lên VPS · Deploy Python Flask VPS