
Nginx Reverse Proxy: Cấu Hình Và Tối Ưu Cho Máy Chủ Web
Nginx reverse proxy là một trong những công cụ mạnh mẽ nhất để quản lý lưu lượng truy cập web. Trong kiến trúc hiện đại, reverse proxy đóng vai trò điểm vào đầu tiên cho mọi request, phân phối tải, bảo mật backend, và tăng tốc phản hồi. Bài viết này hướng dẫn cấu hình chi tiết từ cơ bản đến nâng cao, giúp bạn bảo mật và tăng tốc website chỉ với vài dòng config.

Nginx Reverse Proxy Là Gì?
Reverse proxy đứng phía trước server, nhận yêu cầu từ client rồi chuyển tiếp đến backend. Khác với forward proxy (đại diện cho client), reverse proxy đại diện cho server. Khi client gửi request đến reverse proxy, proxy sẽ quyết định chuyển request đó đến server nào, có thể thay đổi header, nén dữ liệu, hoặc cache kết quả trước khi trả về client.
Nginx với reverse proxy giúp:
- Load balancing phân phối đều request qua nhiều server
- SSL termination giải mã HTTPS tại proxy thay vì từng backend
- Caching tạm phản hồi để tăng tốc đáng kể
- Bảo vệ backend ẩn IP thật khỏi internet
- Compression gzip giảm dung lượng truyền tải
- Rate limiting chống DDoS ở tầng proxy
Cấu Hình Cơ Bản
Đoạn config sau thiết lập reverse proxy cơ bản chuyển hướng mọi request đến server backend trên cổng 3000. Đây là nền tảng bạn sẽ mở rộng cho các trường hợp phức tạp hơn.
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
Giải Thích Các Directive Quan Trọng
- proxy_pass: Địa chỉ backend nhận request. Có thể là IP:port, tên miền, hoặc upstream
- proxy_set_header Host: Truyền host gốc cho backend để backend biết domain client yêu cầu
- proxy_set_header X-Real-IP: IP thật của client, backend dùng cho logging hoặc rate limiting
- proxy_set_header X-Forwarded-For: Chuỗi IP qua proxy, giúp backend biết toàn bộ hành trình request
- proxy_set_header X-Forwarded-Proto: Giao thức gốc (http/https), backend dùng để tạo URL đúng
Thiết Lập HTTPS
Configuration cho HTTPS với certificate:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
}
}
Tìm hiểu thêm về SSL configuration tại tài liệu HTTPS của Nginx.

Load Balancing Với Nginx
Load balancing phân phối request qua nhiều server backend. Nginx hỗ trợ nhiều thuật toán, mỗi thuật toán phù hợp với tình huống khác nhau. Đây là kỹ thuật quan trọng cho hệ thống cần uptime cao.
| Thuật toán | Mô tả | Trường hợp dùng |
|---|---|---|
| round-robin | Phân phối vòng tròn đều, mặc định | Các server ngang nhau về cấu hình |
| least_conn | Gửi đến server có ít kết nối hoạt động nhất | Server có tải khác nhau |
| ip_hash | Dựa trên IP client để chọn server | Cần sticky session |
| weighted | Gán trọng số cho mỗi server | Server mạnh hơn nhận nhiều request hơn |
Cấu Hình Load Balancing
upstream backend {
least_conn;
server 127.0.0.1:3001 weight=3 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3002 weight=2 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3003 backup;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Trong đó weight đặt tỷ lệ request, max_fails đánh dấu server lỗi sau N lần fail liên tiếp, backup chỉ dùng khi server chính lỗi. Tìm hiểu thêm tại tài liệu chính thức của Nginx.
Health Check Và Failover
Active health check (từ Nginx Plus) hoặc passive health check qua max_fails đảm bảo traffic chỉ đến server khỏe mạnh. Khi server lỗi, Nginx tự động chuyển traffic sang server khác. Khi server phục hồi, Nginx từ từ đưa lại traffic (slow start).
Tối Ưu Hiệu Suất
Các setting quan trọng để tối ưu reverse proxy cho hệ thống có tải cao:
- proxy_buffering on: Đệm phản hồi từ backend, worker không bị block chờ response. Client nhận dữ liệu theo tốc độ của nó.
- proxy_cache: Cache phản hồi ở tầng proxy, tăng tốc đáng kể cho nội dung tĩnh hoặc ít thay đổi
- keepalive: Giữ kết nối TCP sống giữa Nginx và backend, tránh chi phí bắt tay lại mỗi request
- gzip: Nén dữ liệu truyền tải, giảm bandwidth 60-80% cho text
- sendfile on: Dùng sendfile syscall để truyền file hiệu quả hơn
- worker_processes auto: Số worker bằng số CPU
Cấu Hình Cache
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mylib:10m max_size=1g inactive=60m;
server {
location / {
proxy_cache mylib;
proxy_cache_valid 200 60m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://backend;
}
}
Header X-Cache-Status giúp debug cache hit/miss/bypass.
Bảo Mật Reverse Proxy
Reverse proxy cũng là lớp bảo mật đầu tiên, bảo vệ backend khỏi các cuộc tấn công trực tiếp:
- Rate limiting: Giới hạn request mỗi IP với
limit_req_zone, chống brute force và DDoS - Block IP độc hại: Dùng
denyhoặc tích hợp với fail2ban - SSL/TLS bắt buộc: Redirect HTTP → HTTPS, dùng Let’s Encrypt
- Ẩn header server:
server_tokens offẩn version Nginx - Custom error pages: Tránh lộ thông tin lỗi chi tiết
Debug Và Monitoring
Công cụ giám sát reverse proxy:
nginx -t: Kiểm tra cấu hình trước khi reloadnginx -s reload: Reload không downtime- Access log với
$upstream_response_timeđo latency backend - Error log mức
debugkhi cần troubleshoot sâu - Nginx stub_status hoặc Prometheus exporter cho monitoring
Kết Luận
Nginx reverse proxy không chỉ đơn thuần là chuyển tiếp request. Với load balancing, caching, SSL termination, bảo mật, và monitoring, nó trở thành xương sống cho mọi hệ thống web hiện đại. Bắt đầu với cấu hình cơ bản, kiểm tra bằng nginx -t, sau đó tối ưu dần theo tải thực tế. Một cấu hình Nginx tốt giúp website xử lý hàng chục nghìn request mỗi giây một cách ổn định.
