Tưởng là nhân vật phụ, ai ngờ là trụ cột hệ thống.
Ngày xửa ngày xưa (tầm vài năm trước), mình cũng từng nghĩ reverse proxy chỉ là một “thằng chuyển phát nhanh”, kiểu nhận request từ client rồi quăng cho backend. Hết chuyện. Nhưng không! Thực ra nó giống như một ông quản gia toàn năng, vừa đón khách, vừa bảo vệ cửa, lại biết chia việc cho đầu bếp, quản lý lịch hẹn, thậm chí còn biết giả vờ là chủ nhà để tiếp khách (!?).
Vậy thì bài này mình sẽ cùng bạn bóc tách từng vai trò của ông quản gia này – à nhầm, reverse proxy nhé
Reverse proxy là gì và tại sao cần nó?
Nguồn: Internet
🌐 Khi truy cập đến Viblo:
- 1, Client gọi đến https://viblo.asia
- 2, Reverse proxy (ví dụ: Nginx) nhận request
- 3, Nginx quyết định: gửi tới service A hay B? Có cần nén không? Có cache không? Có chặn IP xấu không?
- 4, Backend xử lý xong -> trả về -> Nginx gói ghém lại -> trả client
Về bản chất, reverse proxy đứng giữa client và backend server, đại diện backend xử lý giao tiếp.
Các thể loại reverse proxy thường gặp
Nginx – trùm cuối mọi nhà
Nguồn: Internet
Nginx là một web server mã nguồn mở mạnh mẽ, nổi tiếng với hiệu suất cao, khả năng xử lý đồng thời lớn và cấu hình linh hoạt. Ngoài vai trò làm web server truyền thống, Nginx còn được sử dụng phổ biến như một reverse proxy, load balancer, API Gateway, và nhiều hơn thế.
🌟 Tại sao nên dùng Nginx?
Nginx ra đời với mục tiêu xử lý hàng ngàn kết nối đồng thời một cách hiệu quả, điều mà các web server truyền thống (như Apache) gặp khó khăn. Với việc sử dụng kiến thức đơn luồng, kỹ thuật bất đồng bộ (asynchronous), NGINX đạt được hiệu suất và ổn định cao. Bên cạnh đó, Nginx tiêu tốn rất ít tài nguyên dù phải phục vụ lượng lớn request.
Cực kỳ phổ biến, hỗ trợ từ HTTP đến WebSocket, SSL termination, caching, load balancing, static file serving… cái gì cũng biết. Ví dụ: Load balancing traffic đến 2 app backend:
http { upstream backend { server 127.0.0.1:3000; server 127.0.0.1:3001; } server { listen 80; location / { proxy_pass http://backend; } }
}
HAProxy – ông trùm cân tải
Nguồn: Internet
HAProxy (viết tắt của High Availability Proxy) là một phần mềm mã nguồn mở chuyên dùng để load balancing và reverse proxy cho các giao thức TCP và HTTP. Nó được tối ưu cao cho hiệu suất, độ ổn định và khả năng mở rộng – rất phổ biến trong các hệ thống có yêu cầu cao về tính sẵn sàng và chịu tải lớn.
Nếu Nginx là "dao đa năng", thì HAProxy là "máy ép hiệu suất cao" dành riêng cho việc phân phối và kiểm soát lưu lượng.
Hiệu năng khủng, dùng cho cả HTTP và TCP. Phù hợp cho hệ thống cần xử lý hàng chục ngàn kết nối.
Điểm mạnh:
-
Load balancing thông minh
-
Health check, sticky session, SSL termination
Traefik – dân chơi container yêu thích
Nguồn: Internet
Traefik là một modern reverse proxy và load balancer mã nguồn mở, được thiết kế để hoạt động tự động với các nền tảng hiện đại như Docker, Kubernetes, Consul, ECS, v.v.
Khác với Nginx hay HAProxy — vốn cấu hình tĩnh bằng file — Traefik tự động phát hiện dịch vụ và cấu hình routing thông qua service discovery.
Traefik sinh ra để làm “reverse proxy thông minh” trong thế giới container và service mesh.
- Tự phát hiện service qua label → không cần viết config dài dòng
- Hỗ trợ HTTPS tự động (Let's Encrypt)
Ví dụ: Docker Compose dùng Traefik reverse proxy:
services: traefik: image: traefik:v2.10 command: - "--api.insecure=true" - "--providers.docker" - "--entrypoints.web.address=:80" ports: - "80:80" - "8080:8080" # dashboard volumes: - "/var/run/docker.sock:/var/run/docker.sock" whoami: image: containous/whoami labels: - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
Caddy – proxy cho người lười
Nguồn: Internet
Caddy là một web server kiêm reverse proxy mã nguồn mở, nổi bật với tính năng cấu hình cực kỳ đơn giản và HTTPS tự động tích hợp sẵn.
“Just run it” – Caddy có thể start một web server với HTTPS chỉ bằng 1 dòng lệnh. Không cần cấu hình phức tạp, không cần lo Let's Encrypt.
Chỉ cần 2 dòng là có server HTTPS chạy:
example.com { reverse_proxy localhost:8080
}
- Tự xin chứng chỉ HTTPS
- Dễ học, dễ dùng, hỗ trợ HTTP/3 luôn
Envoy – chơi lớn cùng service mesh
Nguồn: Internet
Nếu bạn đang chơi Istio hay kiến trúc microservices phức tạp, Envoy là proxy bạn cần:
-
Hỗ trợ gRPC, retries, circuit breaker, observability
-
Tích hợp mạnh mẽ với Prometheus, Zipkin
Kong, Tyk – API Gateway kiêm proxy
Nguồn: Internet
Kong là một API Gateway và Microservices Management Layer mã nguồn mở, được thiết kế để giúp quản lý, bảo mật, kiểm soát lưu lượng và giám sát các API hoặc microservices trong kiến trúc phân tán.
-
Hỗ trợ auth, rate limiting, analytics, plugin
-
Thường dùng trong hệ thống microservices có public API
Phân loại theo chức năng
Chức năng | Ý nghĩa thực tế |
---|---|
Load balancing | Phân tán tải qua nhiều server backend |
SSL termination | Proxy đứng ra xử lý HTTPS thay cho backend |
Caching | Lưu response để tiết kiệm tài nguyên |
Compression | GZIP/Brotli dữ liệu trước khi gửi về client |
Security | Chặn IP xấu, filter request |
API Gateway | Reverse proxy kết hợp với xác thực, giới hạn, log, giám sát |
Reverse proxy hoạt động ở đâu?
HTTP Proxy
Là proxy chuẩn, chuyên xử lý các request HTTP/HTTPS phổ biến trên website và ứng dụng web. Hỗ trợ các tính năng như routing, load balancing, caching, compression, và bảo mật.
TCP Proxy
Proxy dành cho các dịch vụ chạy trên giao thức TCP thô như Redis, PostgreSQL, MQTT, hay các ứng dụng tùy chỉnh không dùng HTTP. Giúp chuyển tiếp dữ liệu ở tầng transport mà không can thiệp vào nội dung.
WebSocket Proxy
Chuyên proxy cho các ứng dụng realtime như chat, game online, dashboard cập nhật dữ liệu trực tiếp... Bởi WebSocket là một protocol dựa trên TCP nhưng giữ kết nối lâu dài và full-duplex, proxy phải hỗ trợ giữ trạng thái kết nối ổn định.
gRPC Proxy
Dùng cho các hệ thống microservices sử dụng giao thức gRPC – một framework RPC hiện đại dựa trên HTTP/2. Các proxy như Envoy rất mạnh trong việc xử lý gRPC, hỗ trợ load balancing, retry, và quản lý kết nối hiệu quả.
Triển khai reverse proxy kiểu gì?
Mô hình 1: Standalone (Cách truyền thống)
Cài đặt Nginx hoặc HAProxy làm proxy độc lập bên ngoài, đứng giữa client và backend để điều phối traffic. Phương pháp này phổ biến, dễ quản lý với hệ thống nhỏ hoặc trung bình, nhưng thường cần phải viết và duy trì file cấu hình thủ công.
Mô hình 2: Container Native
Sử dụng các proxy như Traefik hoặc Caddy tích hợp cùng Docker hoặc Kubernetes. Ưu điểm là không cần viết file cấu hình thủ công mà cấu hình hoàn toàn thông qua label, annotation hoặc resource của container/service. Giúp triển khai nhanh, linh hoạt và dễ mở rộng trong môi trường container.
Mô hình 3: Sidecar Proxy (Service Mesh)
Mỗi service được gắn kèm một proxy riêng (ví dụ Envoy) chạy cùng dưới dạng container sidecar. Proxy sidecar sẽ chịu trách nhiệm xử lý traffic đến và đi của service đó, giúp quản lý lưu lượng, bảo mật, giám sát ở mức độ rất chi tiết. Mô hình này được áp dụng trong các hệ thống Service Mesh như Istio, Linkerd, yêu cầu đội ngũ DevOps có kinh nghiệm vận hành phức tạp hơn và hệ thống phức tạp hơn. 👀
Kết luận: Reverse proxy không phải để bỏ quên
Nếu hệ thống bạn:
Có nhiều service → dùng reverse proxy để route hợp lý
Cần SSL → proxy xử lý cho khoẻ
Muốn cache, nén, giới hạn truy cập → proxy cân tất
Và bạn hoàn toàn có thể bắt đầu đơn giản với Nginx hoặc Traefik. Càng về sau, khi mở rộng hệ thống, hãy cân nhắc Envoy hoặc các API Gateway chuyên dụng.
Fun fact: Có những team triển khai toàn bộ ứng dụng bằng Docker và Traefik mà không phải viết một dòng cấu hình nào. Họ chỉ dùng label để Traefik tự động định tuyến, rất gọn gàng, giống như “crush lý tưởng” của các developer vậy!
💬 Bạn đang dùng loại reverse proxy nào? Config như nào? Share với anh em cùng học nhé!