Hướng Dẫn Cài Đặt Nginx Reverse Proxy Trên VPS Chi Tiết 2026
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í.
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án | Mô tả | Dùng khi |
|---|---|---|
| round-robin (mặc định) | Luân phiên từng server | Các server cấu hình bằng nhau |
| least_conn | Gửi đến server ít kết nối nhất | Request có thời gian xử lý khác nhau |
| ip_hash | Cùng IP luôn đến cùng server | Cần session sticky |
| weight | Phâ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 Proxy | Có Nginx Reverse Proxy |
|---|---|---|
| Nhiều app trên 1 VPS | Port khác nhau, khó nhớ | 1 domain/app, port 80/443 |
| SSL | Cài riêng từng app | Tập trung 1 chỗ |
| Load balancing | Không có | Có sẵn |
| Caching | Phải code trong app | Tích hợp sẵn |
| Bảo mật | App expose trực tiếp | Nginx che chắn, lọc request |
| Rate limiting | Không | Có — 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 Upgrade và Connection 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