Chào anh em, hôm nay mình sẽ hướng dẫn chi tiết cách thiết lập Nginx làm Reverse Proxy trên Ubuntu (22.04 / 24.04).
Bài viết này rất phù hợp cho những ai đang chạy các ứng dụng như Node.js, Python (Flask/Django) hoặc Docker container ở local port (ví dụ:
Tiếp theo, mở port trên tường lửa (UFW) để cho phép traffic web đi qua:
Kiểm tra xem Nginx đã chạy chưa:
Nếu thấy dòng chữ Active: active (running) là thành công.
Tạo file mới (thay
Dán đoạn cấu hình sau vào file:
Kích hoạt file cấu hình vừa tạo bằng cách tạo symlink (liên kết) sang thư mục
Kiểm tra xem cấu hình có bị lỗi cú pháp không:
Nếu kết quả báo syntax is ok, hãy khởi động lại Nginx:
Cài đặt Certbot và plugin Nginx:
Chạy lệnh sau để tự động lấy chứng chỉ và cấu hình Nginx sang HTTPS (nhớ thay tên miền của anh em vào):
Certbot sẽ tự động cấu hình lại file Nginx để ép (redirect) traffic từ HTTP sang HTTPS. Để kiểm tra xem chứng chỉ có tự động gia hạn thành công sau 90 ngày không, anh em chạy lệnh:
Hy vọng bài viết này giúp anh em dễ dàng setup Nginx cho các dự án của mình. Nếu có bất kỳ câu hỏi hoặc gặp lỗi gì trong quá trình cài đặt, anh em cứ comment bên dưới mình sẽ support nhé!
Bài viết này rất phù hợp cho những ai đang chạy các ứng dụng như Node.js, Python (Flask/Django) hoặc Docker container ở local port (ví dụ:
localhost:8000) và muốn phơi (expose) nó ra internet một cách an toàn thông qua một tên miền chính thức, kèm theo bảo mật SSL (HTTPS).Yêu cầu chuẩn bị
Trước khi bắt đầu, anh em cần có:- Một server đang chạy Ubuntu 22.04 hoặc 24.04 LTS.
- Một ứng dụng đang chạy ở local (trong bài này mình giả sử ứng dụng đang chạy ở
http://127.0.0.1:8000). - Một tên miền (domain) đã được trỏ IP về server của bạn (ví dụ:
your_domain.com).
Bước 1: Cài đặt Nginx
Nginx có sẵn trong kho lưu trữ mặc định của Ubuntu. Anh em mở terminal và chạy các lệnh sau:
Bash:
sudo apt update
sudo apt install nginx
Tiếp theo, mở port trên tường lửa (UFW) để cho phép traffic web đi qua:
Bash:
sudo ufw allow 'Nginx HTTP'
Kiểm tra xem Nginx đã chạy chưa:
Bash:
systemctl status nginx
Bước 2: Cấu hình Server Block (Virtual Host)
Thực hành tốt nhất là tạo một file cấu hình riêng cho từng tên miền thay vì sửa trực tiếp vào file mặc định.Tạo file mới (thay
your_domain.com bằng tên miền thật của anh em):
Bash:
sudo nano /etc/nginx/sites-available/your_domain.com
Dán đoạn cấu hình sau vào file:
NGINX:
server {
listen 80;
listen [::]:80;
server_name your_domain.com www.your_domain.com;
location / {
proxy_pass http://127.0.0.1:8000;
include proxy_params;
}
}
Lưu ý: Chỉ thịproxy_passlà linh hồn của Reverse Proxy. Nó sẽ điều hướng toàn bộ request từ người dùng vào ứng dụng đang chạy ở cổng 8000.
Hiểu về Headers (proxy_params)
Khi dùng Nginx làm proxy, điều quan trọng là ứng dụng bên trong vẫn cần biết thông tin thật của người dùng (IP, giao thức,...). Nginx dùng các biến sau để forward (chuyển tiếp) thông tin này:| Header HTTP | Biến Nginx tương ứng | Ý nghĩa |
|---|---|---|
| Host | $http_host | Tên miền và cổng gốc mà người dùng yêu cầu. |
| X-Real-IP | $remote_addr | IP thật duy nhất của người dùng cuối. |
| X-Forwarded-For | $proxy_add_x_forwarded_for | IP của người dùng, bao gồm cả chuỗi IP nếu qua nhiều proxy. |
| X-Forwarded-Proto | $scheme | Giao thức ban đầu người dùng dùng để kết nối (HTTP/HTTPS). |
Kích hoạt file cấu hình vừa tạo bằng cách tạo symlink (liên kết) sang thư mục
sites-enabled:
Bash:
sudo ln -s /etc/nginx/sites-available/your_domain.com /etc/nginx/sites-enabled/
Kiểm tra xem cấu hình có bị lỗi cú pháp không:
Bash:
sudo nginx -t
Bash:
sudo systemctl restart nginx
Bước 3: Bảo mật với HTTPS (Let's Encrypt & Certbot)
Thời buổi này web mà không có HTTPS thì trình duyệt sẽ cảnh báo đỏ lòm. Rất may là Let’s Encrypt cung cấp SSL hoàn toàn miễn phí.Cài đặt Certbot và plugin Nginx:
Bash:
sudo apt update
sudo apt install certbot python3-certbot-nginx
Chạy lệnh sau để tự động lấy chứng chỉ và cấu hình Nginx sang HTTPS (nhớ thay tên miền của anh em vào):
Bash:
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
Certbot sẽ tự động cấu hình lại file Nginx để ép (redirect) traffic từ HTTP sang HTTPS. Để kiểm tra xem chứng chỉ có tự động gia hạn thành công sau 90 ngày không, anh em chạy lệnh:
Bash:
sudo certbot renew --dry-run
Khắc phục các lỗi thường gặp (Troubleshooting)
Nếu gặp trục trặc, hãy check nhanh các lỗi sau:- Lỗi 502 Bad Gateway: 99% là do Nginx không kết nối được với ứng dụng bên trong. Kiểm tra xem app của bạn đã bật chưa (
ss -tuln | grep 8000) hoặc configproxy_passđã đúng IP/Port chưa. Đừng quên tiền tốhttp://. - Lỗi SSL/Không có ổ khóa xanh: Kiểm tra lại đường dẫn chứng chỉ trong Nginx và đảm bảo bạn không chặn port 443 trên Firewall.
- Không truy cập được tên miền: Hãy check lại bản ghi DNS (Record A) xem đã trỏ đúng về IP Public của Server chưa (
dig +short your_domain.com).
Hy vọng bài viết này giúp anh em dễ dàng setup Nginx cho các dự án của mình. Nếu có bất kỳ câu hỏi hoặc gặp lỗi gì trong quá trình cài đặt, anh em cứ comment bên dưới mình sẽ support nhé!