Reverse proxy là gì? Cách một VPS chạy 10 website

Chia sẻ bài viết

Mục lục
Reverse proxy là gì? Cách một VPS chạy 10 website

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.

Tóm tắt nhanh
  • 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 tinh

Quy 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ìnhSố trang tĩnh hoặc ít kháchSố trang động cỡ vừaĐiểm nghẽn tới trước
1 nhân, 2 GB10 tới 202 tới 3Bộ nhớ
2 nhân, 4 GB30 tới 505 tới 8Bộ nhớ, rồi tới ổ đĩa
4 nhân, 8 GBnhiều10 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
done

Dò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.

Hạ tầng NVMe Enterprise của TND
VPS ổ Enterprise U.2 NVMe, CPU xung cao, đặt tại Việt Nam
Mô hình 'một VPS cả danh mục site' đứng vững hay không là ở nền: TND VPS NVMe với Xeon Platinum xung cao cho chục app chen vai vẫn phản hồi lẹ, Enterprise U.2 NVMe RAID 10 cho log + database + static của cả đám không nghẽn I/O. Gói 8 GB nuôi cả portfolio, Caddyfile mỗi site 3 dòng, bàn giao máy trong 5 phút.
Dùng thử VPS NVMe, bàn giao trong 5 phút

Bài viết liên quan