Cài Reverse Proxy Nginx Trên VPS - Hướng Dẫn Quản Lý Nhiều Website Trên 1 VPS

📅 05/2026 · ⏱ 13 phút đọc · 🏷 Hướng Dẫn

Bạn có 1 VPS nhưng muốn chạy 3-4 website, mỗi site một domain/subdomain khác nhau? Hay bạn muốn chạy Node.js app, Python API, và WordPress cùng lúc trên 1 VPS? Nginx Reverse Proxy chính là câu trả lời. Với VPS TrumVPS từ 40K/tháng, bạn có thể làm tất cả điều đó — và bài viết này sẽ hướng dẫn bạn từng bước.

Reverse Proxy Là Gì? Tại Sao Cần?

Reverse Proxy giống như một "nhân viên lễ tân" đứng trước server của bạn. Khi có request từ internet gửi đến, reverse proxy sẽ:

  1. Nhận request (vd: truy cập api.yoursite.com)
  2. Xác định request này dành cho ứng dụng nào (Node.js port 3000? WordPress port 8080?)
  3. Chuyển tiếp request đến đúng ứng dụng backend
  4. Trả kết quả về cho người dùng
💡 Ví dụ thực tế: 1 VPS TrumVPS 40K/tháng có thể chạy đồng thời: WordPress (port 8080), Node.js API (port 3000), Python Flask app (port 5000), và Admin Panel (port 8000) — tất cả qua cùng 1 IP, 1 port 80/443!

Lợi Ích Của Nginx Reverse Proxy

✅ Lợi ích

  • Chạy nhiều website/app trên 1 VPS
  • Che giấu port thực của ứng dụng
  • Load balancing (chia tải giữa nhiều instance)
  • Cache tĩnh, giảm tải backend
  • Chấm dứt SSL ở 1 nơi duy nhất
  • Dễ dàng thêm/bớt ứng dụng không downtime

⚠️ Lưu ý

  • Cần cấu hình đúng để tránh lỗi routing
  • Header forwarding phải cấu hình chính xác
  • WebSocket cần cấu hình riêng
  • Nếu Nginx chết → tất cả site chết

Yêu Cầu

Bước 1: Cài Đặt Nginx

SSH vào VPS và cài Nginx:

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

Kiểm tra Nginx đã chạy:

sudo systemctl status nginx
curl -I http://localhost

Nếu thấy HTTP/1.1 200 OK và "Welcome to nginx!" → thành công!

Bước 2: Hiểu Cấu Trúc File Cấu Hình Nginx

Trên Ubuntu, cấu trúc thư mục Nginx:

/etc/nginx/
├── nginx.conf              ← File cấu hình chính
├── sites-available/        ← Chứa file cấu hình từng site
└── sites-enabled/          ← Symlink từ sites-available (site đang active)

Quy tắc: Tạo file config trong sites-available/, sau đó symlink sang sites-enabled/ để kích hoạt.

Bước 3: Cấu Hình Reverse Proxy Cho Ứng Dụng Đầu Tiên

Giả sử bạn có 1 Node.js app chạy ở port 3000 và muốn truy cập qua domain app.yourdomain.com.

Tạo file cấu hình:

sudo nano /etc/nginx/sites-available/app.yourdomain.com

Dán nội dung sau:

server {
    listen 80;
    server_name app.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;
        proxy_read_timeout 90;
    }
}

Kích hoạt site:

sudo ln -s /etc/nginx/sites-available/app.yourdomain.com /etc/nginx/sites-enabled/
sudo nginx -t          # Kiểm tra syntax
sudo systemctl reload nginx

Bây giờ truy cập http://app.yourdomain.com → sẽ thấy Node.js app của bạn!

💡 Giải thích header quan trọng: X-Real-IPX-Forwarded-For gửi IP thật của người dùng đến backend. Nếu thiếu các header này, backend của bạn sẽ luôn thấy IP 127.0.0.1 — rất tệ cho logging và security!

Bước 4: Chạy Nhiều Website Trên Cùng 1 VPS

Đây là sức mạnh thực sự của reverse proxy. Bạn có thể chạy:

DomainỨng DụngPort Backend
app.yourdomain.comNode.js API3000
blog.yourdomain.comWordPress (Apache)8080
admin.yourdomain.comPython Flask5000
api.yourdomain.comExpress.js3001

Chỉ cần tạo 4 file config riêng trong sites-available/, mỗi file trỏ proxy_pass đến port tương ứng. Tất cả dùng chung port 80/443!

Ví dụ cấu hình WordPress qua reverse proxy:

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

    location / {
        proxy_pass http://127.0.0.1:8080;
        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;
    }

    # Cho phép upload file lớn
    client_max_body_size 100M;
}

Bước 5: Cấu Hình SSL Miễn Phí Với Let's Encrypt

Cài Certbot và lấy SSL cho tất cả domain cùng lúc:

sudo apt install -y certbot python3-certbot-nginx

# Lấy SSL cho từng domain
sudo certbot --nginx -d app.yourdomain.com
sudo certbot --nginx -d blog.yourdomain.com
sudo certbot --nginx -d admin.yourdomain.com

Certbot tự động sửa file config Nginx, thêm listen 443 ssl và redirect HTTP → HTTPS. Quá đơn giản!

Kiểm tra tự động gia hạn:

sudo certbot renew --dry-run

Bước 6: Cấu Hình WebSocket (Cho Real-time Apps)

Nếu ứng dụng của bạn dùng WebSocket (chat app, live dashboard), cần thêm config đặc biệt:

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_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_read_timeout 86400;  # Giữ kết nối WebSocket 24h
}

Bước 7: Load Balancing Cơ Bản

Nếu ứng dụng của bạn cần xử lý nhiều traffic, chạy nhiều instance và dùng Nginx chia tải:

upstream nodejs_backend {
    least_conn;  # Gửi request đến server ít kết nối nhất
    server 127.0.0.1:3000 weight=3;  # Server mạnh, nhận 3x request
    server 127.0.0.1:3001 weight=1;
    server 127.0.0.1:3002 backup;    # Chỉ dùng khi 2 server trên chết
}

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

    location / {
        proxy_pass http://nodejs_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Bước 8: Cache Nội Dung Tĩnh

Giảm tải backend bằng cách cache CSS, JS, ảnh ngay trên Nginx:

# Thêm vào trong block http {} của /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 ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff2)$ {
    proxy_pass http://127.0.0.1:3000;
    proxy_cache my_cache;
    proxy_cache_valid 200 1h;
    proxy_cache_use_stale error timeout updating;
    add_header X-Cache-Status $upstream_cache_status;
}

Debug: Các Lỗi Thường Gặp Và Cách Fix

❌ "502 Bad Gateway"

Nginx không kết nối được backend. Kiểm tra:

❌ "504 Gateway Timeout"

Backend phản hồi quá chậm. Tăng timeout:

proxy_read_timeout 300;
proxy_connect_timeout 300;

❌ Website hiển thị sai domain/IP

Thiếu header proxy_set_header Host $host; → backend không biết domain gốc là gì.

❌ WebSocket không hoạt động

Kiểm tra đã thêm proxy_set_header Upgradeproxy_set_header Connection "Upgrade" chưa.

🔥 Pro tip: Dùng lệnh sudo tail -f /var/log/nginx/error.log để xem log lỗi real-time khi debug. 90% vấn đề reverse proxy hiện rõ trong log này!

So Sánh: Reverse Proxy vs Không Reverse Proxy

Tiêu chíKhông Reverse ProxyCó Reverse Proxy
Số website trên 1 VPS1 site/port 80Không giới hạn
Port truy cậpPhải nhớ port (vd: :3000)Luôn là 80/443
SSLCấu hình riêng từng appTập trung 1 chỗ
Load balancingKhông cóCó sẵn
CacheTùy từng appTập trung, hiệu quả
Bảo mậtLộ port thậtẨn port backend

Kết Luận

Nginx Reverse Proxy là kỹ năng bắt buộc phải biết nếu bạn quản lý VPS. Chỉ với 1 file config vài dòng, bạn mở ra khả năng chạy hàng chục website trên cùng 1 VPS 40K/tháng của TrumVPS.

Từ WordPress, Node.js, đến Python Flask — tất cả chạy mượt mà sau 1 Nginx reverse proxy. Kết hợp với Let's Encrypt SSL miễn phí, bạn có 1 hệ thống web chuyên nghiệp mà không tốn thêm 1 xu nào.

Cần VPS để thực hành ngay?

VPS TrumVPS từ 40K/tháng - NVMe SSD - Đủ sức chạy 5-10 website cùng lúc

Mã giảm giá: 42089QPI03TI (-9%)

🚀 THUÊ VPS NGAY