Hướng dẫn cấu hình Nginx Reverse Proxy với SSL Certbot và Docker chuẩn Production
Cẩm nang toàn diện cấu hình Nginx Reverse Proxy trên Ubuntu: Tích hợp chứng chỉ SSL Let's Encrypt miễn phí qua Certbot, hỗ trợ WebSockets, HTTP/2, nén Brotli/Gzip và Rate Limiting chống DDoS.

Nginx Reverse Proxy là gì và tại sao bạn cần nó?
Trong kiến trúc hệ thống hiện đại, Reverse Proxy là một máy chủ đứng trước các ứng dụng backend (Node.js, Python, Go, Java, Docker container...) và nhận mọi yêu cầu (HTTP/HTTPS request) từ trình duyệt của người dùng gửi tới, sau đó chuyển tiếp (forward) chúng đến các dịch vụ nội bộ phù hợp..
Sử dụng Nginx làm Reverse Proxy mang lại nhiều lợi thế vượt trội:
- Bảo mật tuyệt đối: Ẩn giấu địa chỉ IP nội bộ và kiến trúc hạ tầng thực sự của các container ứng dụng.
- Tập trung quản lý chứng chỉ SSL/TLS: Tự động giải mã HTTPS tại Nginx (SSL Termination), giảm tải gánh nặng tính toán mật mã cho ứng dụng backend.
- Tải và Cân bằng tải (Load Balancing): Phân phối lưu lượng truy cập đều đặn giữa nhiều bản sao container backend.
- Tối ưu tốc độ: Bộ nhớ đệm (Caching), nén dữ liệu Gzip/Brotli và hỗ trợ giao thức HTTP/2, HTTP/3 giúp website tải siêu nhanh.
- Bảo vệ ứng dụng: Giới hạn tần suất yêu cầu (Rate Limiting) để ngăn chặn các cuộc tấn công quét lỗ hổng hoặc DDoS phân tầng.
1. Cài đặt Nginx trên Ubuntu Server
Cập nhật danh sách gói và tiến hành cài đặt Nginx từ kho phần mềm chính thức:
sudo apt update
sudo apt install -y nginx
Khởi động và kích hoạt Nginx tự chạy cùng hệ điều hành:
sudo systemctl enable nginx
sudo systemctl start nginx
Kiểm tra trạng thái hoạt động:
sudo systemctl status nginx --no-pager
Mở cổng tường lửa UFW cho phép lưu lượng HTTP (80) và HTTPS (443):
sudo ufw allow 'Nginx Full'
2. Cấu trúc Server Block chuẩn cho ứng dụng Web / Docker
Giả sử bạn có một ứng dụng Node.js hoặc Docker container đang lắng nghe tại cổng http://127.0.0.1:3000 và bạn muốn gắn tên miền api.example.com trỏ tới dịch vụ này.
Tạo một file cấu hình Server Block mới tại /etc/nginx/sites-available/api.example.com.conf:
sudo nano /etc/nginx/sites-available/api.example.com.conf
Dán nội dung cấu hình chuẩn hóa sau vào file:
# Định nghĩa nhóm Upstream Backend
upstream nodejs_backend {
server 127.0.0.1:3000 max_fails=3 fail_timeout=10s;
keepalive 32;
}
server {
listen 80;
listen [::]:80;
server_name api.example.com;
# Cấu hình log riêng cho domain
access_log /var/log/nginx/api.example.com.access.log;
error_log /var/log/nginx/api.example.com.error.log warn;
# Giới hạn kích thước tải lên file (ví dụ: tối đa 20MB)
client_max_body_size 20M;
location / {
proxy_pass http://nodejs_backend;
# Thiết lập các HTTP Headers chuyển tiếp chuẩn xác
proxy_http_version 1.1;
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;
# Hỗ trợ WebSockets thời gian thực
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Thời gian chờ phản hồi từ ứng dụng
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Bộ đệm truyền tải
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 8k;
}
}
Kích hoạt file cấu hình bằng cách tạo liên kết mềm (symlink) sang thư mục sites-enabled:
sudo ln -s /etc/nginx/sites-available/api.example.com.conf /etc/nginx/sites-enabled/
Kiểm tra cú pháp cấu hình Nginx:
sudo nginx -t
Nếu hiển thị syntax is ok và test is successful, hãy reload Nginx:
sudo systemctl reload nginx
3. Cài đặt chứng chỉ SSL miễn phí với Let's Encrypt & Certbot
Certbot là công cụ tự động xin cấp và gia hạn chứng chỉ bảo mật SSL/TLS miễn phí từ tổ chức phi lợi nhuận Let's Encrypt.
Cài đặt Certbot qua Snap (cách thức chính thức được khuyến nghị bởi EFF):
sudo snap install core && sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Chạy lệnh tạo chứng chỉ tự động cho tên miền của bạn:
sudo certbot --nginx -d api.example.com
Trong quá trình cài đặt:
- Nhập email của bạn để nhận thông báo gia hạn chứng chỉ.
- Đồng ý với điều khoản dịch vụ (
Y). - Chọn tùy chọn tự động chuyển hướng toàn bộ lưu lượng HTTP sang HTTPS (Redirect).
Kiểm tra tính năng tự động gia hạn chứng chỉ (Auto-Renewal)
Chứng chỉ của Let's Encrypt có thời hạn 90 ngày. Certbot đã tự động cài đặt bộ lập lịch (systemd timer) để gia hạn tự động trước khi hết hạn 30 ngày. Hãy kiểm tra thử quá trình giả lập gia hạn:
sudo certbot renew --dry-run
4. Tối ưu hiệu năng Nginx (Gzip & HTTP/2)
Để tăng tốc độ tải trang lên mức tối đa, hãy bật tính năng nén Gzip và HTTP/2.
Mở file cấu hình chính /etc/nginx/nginx.conf:
sudo nano /etc/nginx/nginx.conf
Đảm bảo khối http có các cấu hình nén sau:
## Gzip Settings
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/svg+xml
text/css
text/javascript
text/plain
text/xml;
Sau khi Certbot chỉnh sửa file cấu hình ở Bước 3, khối server HTTPS sẽ tự động có dạng listen 443 ssl http2;. Điều này giúp trình duyệt có thể ghép kênh (Multiplexing) nhiều file tài nguyên tĩnh qua một kết nối TCP duy nhất.
5. Chống Spam & DDoS với Rate Limiting
Để ngăn chặn các kẻ tấn công spam request làm sập backend, Nginx hỗ trợ thuật toán giới hạn tốc độ Leaky Bucket.
Mở file /etc/nginx/conf.d/rate_limit.conf:
sudo nano /etc/nginx/conf.d/rate_limit.conf
Thêm cấu hình:
# Giới hạn tối đa 10 requests / giây theo từng địa chỉ IP khách
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
Sau đó, trong file cấu hình domain của bạn, áp dụng quy tắc vào location /:
location / {
limit_req zone=api_limit burst=20 nodelay;
limit_req_status 429;
proxy_pass http://nodejs_backend;
...
}
burst=20: Cho phép người dùng bình thường có thể gửi tối đa 20 request tức thời trong tích tắc mà không bị chặn.limit_req_status 429: Trả về mã lỗi HTTP 429 Too Many Requests chuẩn mực quốc tế khi vượt ngưỡng.
6. Các lệnh quản lý Nginx cần ghi nhớ
# Kiểm tra file cấu hình trước khi áp dụng (CỰC KỲ QUAN TRỌNG)
sudo nginx -t
# Nạp lại cấu hình mượt mà không làm gián đoạn kết nối người dùng (Zero Downtime)
sudo systemctl reload nginx
# Khởi động lại toàn bộ dịch vụ Nginx
sudo systemctl restart nginx
# Xem log truy cập thời gian thực
sudo tail -f /var/log/nginx/access.log
# Xem log lỗi
sudo tail -f /var/log/nginx/error.log
Lời kết
Với Nginx Reverse Proxy kết hợp chứng chỉ SSL Let's Encrypt, bạn đã xây dựng được một cổng vào (API Gateway / Ingress) an toàn, nhanh chóng và đạt chuẩn sản xuất cho toàn bộ hệ thống ứng dụng trên máy chủ của mình.



Đăng nhập bằng tài khoản GitHub để đặt câu hỏi hoặc đóng góp ý kiến cho bài viết.