Cài Reverse Proxy Nginx Trên VPS - Hướng Dẫn Quản Lý Nhiều Website Trên 1 VPS
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ẽ:
- Nhận request (vd: truy cập
api.yoursite.com) - Xác định request này dành cho ứng dụng nào (Node.js port 3000? WordPress port 8080?)
- Chuyển tiếp request đến đúng ứng dụng backend
- Trả kết quả về cho người dùng
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
- VPS TrumVPS (Ubuntu 22.04 hoặc 24.04)
- Domain đã trỏ về IP VPS (A record)
- SSH vào VPS với quyền root hoặc sudo
- Các ứng dụng backend đã chạy (WordPress, Node.js, v.v.)
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!
X-Real-IP và X-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ụng | Port Backend |
|---|---|---|
| app.yourdomain.com | Node.js API | 3000 |
| blog.yourdomain.com | WordPress (Apache) | 8080 |
| admin.yourdomain.com | Python Flask | 5000 |
| api.yourdomain.com | Express.js | 3001 |
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:
- App backend có đang chạy không?
curl http://127.0.0.1:3000 - Port có đúng không?
- Firewall có chặn không?
sudo ufw status
❌ "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 Upgrade và proxy_set_header Connection "Upgrade" chưa.
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 Proxy | Có Reverse Proxy |
|---|---|---|
| Số website trên 1 VPS | 1 site/port 80 | Không giới hạn |
| Port truy cập | Phải nhớ port (vd: :3000) | Luôn là 80/443 |
| SSL | Cấu hình riêng từng app | Tập trung 1 chỗ |
| Load balancing | Không có | Có sẵn |
| Cache | Tùy từng app | Tập trung, hiệu quả |
| Bảo mật | Lộ 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