
Trả lời nhanh: Reverse proxy là người gác cổng của máy chủ: mọi truy cập từ internet (cổng 80/443) đều gõ cửa nó trước, nó nhìn tên miền khách hỏi rồi chuyển vào đúng ứng dụng đang chạy ở cổng nội bộ, shop.vn vào app cổng 3000, blog.vn vào cổng 8080, n8n.shop.vn vào 5678. Nhờ vậy một VPS một IP chạy được cả chục website, HTTPS lo tập trung một chỗ, app thật không bao giờ phơi mặt trực tiếp ra internet. Caddy, Nginx, Traefik là ba gác cổng phổ biến nhất.
"Mỗi website một server" là hiểu lầm đắt tiền của người mới. Sự thật: một VPS tầm trung nuôi cả danh mục site của một freelancer, chìa khóa nằm ở một khái niệm tên nghe rối nhưng cơ chế cực đơn giản: reverse proxy. Bài này giải thích nó bằng hình ảnh đời thường, kèm kiến trúc mẫu 10-site và các câu hỏi ngã ba hay gặp.
- Một IP chỉ có một cổng 443, reverse proxy là cách nhiều app 'chung sổ đỏ' một cổng
- Phân phối theo Host header: khách hỏi tên miền nào, chuyển vào app nấy
- HTTPS làm một chỗ: chứng chỉ mọi tên miền quản tập trung tại gác cổng
- App thật nấp sau 127.0.0.1, internet không bao giờ chạm thẳng vào chúng
Vì sao cần gác cổng: bài toán một cổng nhiều nhà
Trên một IP, cổng 443 chỉ một tiến trình được nghe. Nhưng bạn có 10 site, không lẽ site nào cũng bắt khách gõ :3001, :3002? Reverse proxy giải bằng cách một mình nó giữ cổng 443, rồi đọc phần Host trong mỗi request (trình duyệt luôn khai đang hỏi tên miền nào) để chuyển đúng nhà. Giống lễ tân tòa nhà: một cửa chính, ai hỏi công ty nào dẫn lên đúng tầng đó, các công ty bên trong không cần cửa riêng ra mặt phố.
Kiến trúc mẫu: 10 site trên một VPS
internet ──443──> [ Caddy/Nginx ]
│ shop.vn → 127.0.0.1:3000 (Next.js, PM2)
│ blog.vn → 127.0.0.1:8080 (WordPress container)
│ khach-a.vn → 127.0.0.1:3001
│ khach-b.vn → 127.0.0.1:3002
│ n8n.shop.vn → 127.0.0.1:5678
│ api.shop.vn → 127.0.0.1:4000
└ static.shop.vn → thu muc file tinhQuy tắc vàng đi kèm: mọi app bind vào 127.0.0.1, không bind 0.0.0.0, internet chỉ có một đường vào là gác cổng; database, admin, app dở dang đều vô hình từ bên ngoài. Đây vừa là kiến trúc, vừa là tầng bảo mật đầu tiên.
Ba việc gác cổng làm luôn cho bạn
- HTTPS tập trung: chứng chỉ 10 tên miền nằm một chỗ, Caddy tự xin tự gia hạn cả loạt; app phía sau nói chuyện HTTP nội bộ đơn giản, khỏi mỗi con tự lo TLS.
- Nén và header chung: gzip/zstd, security header (HSTS...) cấu hình một lần phủ mọi site.
- Đệm và giới hạn: chặn request dị dạng, rate-limit chống spam form, buffer upload, sóng gió dừng ở cổng, app bên trong sống yên.
Ngã ba hay gặp và lời khuyên gọn
- Chọn gác cổng nào? Tay tự quản: Caddy cho gọn (bài so với Nginx ngay trong cụm). Dùng panel Coolify/Dokploy: Traefik có sẵn, khỏi nghĩ.
- Forward proxy khác gì? Ngược hướng: forward proxy đứng phía người dùng che danh tính khách khi ra internet; reverse proxy đứng phía máy chủ che app khỏi internet. Cùng chữ proxy, hai nghề khác nhau.
- Load balancer là gì trong bức tranh? Cũng là reverse proxy, nhưng chia tải nhiều máy chạy cùng một app. Một VPS nhiều app: reverse proxy thường; một app nhiều VPS: load balancer. Lớn nữa thì cả hai chồng nhau.
- Bao nhiêu site là quá nhiều cho một VPS? Gác cổng gánh hàng trăm site nhẹ nhàng, trần nằm ở RAM/CPU của các app phía sau. Cứ cộng khẩu phần từng app (bài Node hosting có bảng) và chừa 30% thở.
Máy cỡ nào chạy được bao nhiêu trang
| Cấu hình | Số trang tĩnh hoặc ít khách | Số trang động cỡ vừa | Điểm nghẽn tới trước |
|---|---|---|---|
| 1 nhân, 2 GB | 10 tới 20 | 2 tới 3 | Bộ nhớ |
| 2 nhân, 4 GB | 30 tới 50 | 5 tới 8 | Bộ nhớ, rồi tới ổ đĩa |
| 4 nhân, 8 GB | nhiều | 10 tới 15 | Ổ đĩa và cơ sở dữ liệu |
Con số quyết định không phải số trang mà là tổng lượng truy cập và số tiến trình xử lý mỗi trang cần. Mười trang không ai vào nhẹ hơn một trang có nghìn khách mỗi ngày.
Ba việc lớp gác cổng làm luôn cho bạn
- Chứng chỉ bảo mật cho mọi tên miền, cấp và gia hạn tự động, không phải nhớ ngày hết hạn.
- Nén nội dung trước khi gửi, giảm đáng kể dung lượng truyền và làm trang nhanh hơn trên mạng di động.
- Đặt giới hạn tần suất và chặn địa chỉ xấu ở một chỗ, thay vì cấu hình riêng trong từng ứng dụng.
Kiểm cấu hình đúng
# Kiem cau hinh truoc khi nap lai, tranh sap ca 10 site cung luc
nginx -t && systemctl reload nginx
# hoac
caddy validate --config /etc/caddy/Caddyfile
# Xem cac ung dung dang lang nghe tren cong noi bo
ss -ltnp | grep 127.0.0.1
# Kiem tung site tra ve dung
for d in site1.vn site2.vn site3.vn; do
echo -n "$d: "; curl -o /dev/null -s -w "%{http_code} %{time_total}s\n" https://$d
done
# Xem chung chi con han bao lau
for d in site1.vn site2.vn; do
echo -n "$d: "; echo | openssl s_client -connect $d:443 2>/dev/null | openssl x509 -noout -enddate
doneDòng đầu tiên là thói quen quan trọng nhất khi chạy nhiều trang trên một máy: luôn kiểm cấu hình trước khi nạp lại. Một dấu chấm phẩy thiếu làm cả mười trang cùng chết, chứ không chỉ trang bạn vừa sửa.
Ba lỗi hay gặp khi chạy nhiều trang
- Quên đặt các tiêu đề chuyển tiếp, khiến ứng dụng phía sau thấy sai địa chỉ khách và sai giao thức, sinh ra chuyển hướng vòng lặp.
- Đặt giới hạn kích thước tệp tải lên ở lớp gác cổng thấp hơn ứng dụng, nên người dùng gặp lỗi khi tải tệp lớn mà ứng dụng không ghi nhận gì.
- Không giới hạn kích thước nhật ký. Mười trang sinh nhật ký nhanh gấp mười, và ổ đầy làm mọi trang cùng chết.
Câu hỏi thường gặp
Khách có biết site tôi đi qua reverse proxy không?
Không, với khách, mọi thứ là một website bình thường trên tên miền của bạn. Proxy trong suốt hoàn toàn về trải nghiệm.
App làm sao biết IP thật của khách khi mọi request đến từ proxy?
Proxy gắn kèm header X-Forwarded-For chứa IP gốc, framework nào cũng có công tắc 'trust proxy' để đọc đúng. Quên bật là log toàn thấy 127.0.0.1, một lỗi kinh điển vui vẻ.
Hai app cùng muốn cổng 3000 thì sao?
Đổi PORT một app (biến môi trường), cổng nội bộ là số tùy ý, chỉ cần khớp giữa app và dòng khai trong cấu hình proxy. Đây là lý do quy ước 'mỗi app một port, ghi vào CLAUDE.md' trong bài worktree.
Site đông khách chung VPS với site vắng có giẫm nhau không?
Có thể, CPU/RAM là tài nguyên chung. Mức freelancer: theo dõi bằng pm2 monit/htop, site nào lớn vượt trội thì tách máy riêng cho nó. Ổ NVMe giúp phần I/O ít trở thành điểm giẫm nhau nhất.
Bài viết liên quan
- Caddy vs Nginx: reverse proxy nào cho người bận
- Node.js hosting: 5 phương án từ free đến pro
- VPS ổ Enterprise U.2 NVMe RAID 10 tại TND
- VPS Windows hay VPS Linux: chọn theo nhu cầu, không theo thói quen
- tmux là gì? Để Claude Code chạy tiếp khi bạn tắt laptop
- Deploy Next.js preview qua Cloudflare Tunnel trên VPS 2GB không cần Vercel
- Claude Design: Hướng Dẫn Áp Dụng Cho Dev WordPress + VPS Việt Nam (Kết Hợp Vibe Coding)
- Transfer domain từ GoDaddy, Namecheap về TND
- Lỗi Tailscale 403, session expired, logged out: cách sửa



