Proxy ngược Nginx nhận yêu cầu từ khách truy cập trang web rồi chuyển tiếp đến một máy chủ hoặc ứng dụng khác. Giải pháp này thường được dùng để cho phép truy cập các ứng dụng chạy trên những cổng như 3000 thông qua tên miền mà không để lộ các cổng nội bộ ra internet.
Trong hướng dẫn này, bạn sẽ cấu hình Nginx trên Ubuntu để chuyển tiếp yêu cầu đến một ứng dụng cục bộ, kết nối tên miền và bật HTTPS.
Proxy ngược Nginx là gì?
Proxy ngược nằm giữa khách truy cập và ứng dụng backend của bạn.
Thay vì kết nối trực tiếp đến ứng dụng chạy trên cổng 3000, khách truy cập kết nối với Nginx qua các cổng HTTP hoặc HTTPS tiêu chuẩn.
Nginx chuyển tiếp yêu cầu đến ứng dụng và trả lại phản hồi của ứng dụng.
Luồng yêu cầu diễn ra như sau:
Khách truy cập → Nginx → Ứng dụng backend
Cách thiết lập này thường được dùng cho Node.js, Python và các ứng dụng web khác. Nó cũng có thể hỗ trợ kết thúc kết nối TLS, cân bằng tải và xử lý yêu cầu tập trung.
Yêu cầu trước khi bắt đầu
Trước khi bắt đầu, bạn cần:
- Một máy chủ Ubuntu 24.04 LTS có quyền truy cập sudo.
- Quyền truy cập máy chủ qua SSH.
- Một tên miền trỏ đến địa chỉ IP công khai của máy chủ.
- Một ứng dụng backend lắng nghe trên cổng cục bộ.
Trong ví dụ này, chúng ta sẽ dùng cổng 3000.
Nếu bạn chưa quen với SSH, hãy đọc hướng dẫn lệnh SSH dành cho người mới bắt đầu của chúng tôi trước khi tiếp tục.

Bước 1: Cài đặt Nginx trên Ubuntu
Kết nối với máy chủ Ubuntu của bạn qua SSH.
Cập nhật danh mục gói và cài đặt Nginx:
sudo apt update
sudo apt install nginx -y
Kiểm tra Nginx có đang chạy hay không:
sudo systemctl status nginx
Bạn sẽ thấy trạng thái active (running).
Nếu Nginx chưa khởi động, hãy chạy:
sudo systemctl enable --now nginx
Bạn cũng có thể truy cập địa chỉ IP công khai của máy chủ bằng trình duyệt. Trang chào mừng mặc định của Nginx sẽ xuất hiện nếu truy cập HTTP được cho phép.
Nếu bạn đang dùng UFW, hãy cho phép lưu lượng HTTP và HTTPS:
sudo ufw allow 'Nginx Full'
Đồng thời, hãy kiểm tra các quy tắc tường lửa được cấu hình thông qua nhà cung cấp dịch vụ lưu trữ của bạn. Đừng tắt tường lửa chỉ để có thể truy cập Nginx.
Bước 2: Khởi chạy ứng dụng backend để kiểm tra
Trước khi cấu hình proxy ngược, chúng ta cần một ứng dụng để Nginx chuyển tiếp yêu cầu đến.
Để kiểm tra đơn giản, hãy tạo một thư mục tạm:
mkdir -p ~/nginx-proxy-test
cd ~/nginx-proxy-test
Tạo một trang HTML cơ bản:
echo '<h1>Nginx Reverse Proxy Works!</h1>' > index.html
Bây giờ, hãy khởi chạy máy chủ HTTP tích hợp sẵn của Python:
python3 -m http.server 3000 --bind 127.0.0.1
Thao tác này cung cấp trang thử nghiệm của bạn trên cổng 3000, chỉ có thể truy cập qua địa chỉ loopback cục bộ.
Giữ phiên terminal này chạy và mở một phiên SSH thứ hai.
Xác minh rằng ứng dụng phản hồi:
curl http://127.0.0.1:3000
Bạn sẽ thấy:
<h1>Nginx Reverse Proxy Works!</h1>
Máy chủ Python này chỉ dùng để minh họa. Với ứng dụng chạy trong môi trường production, hãy dùng máy chủ ứng dụng và cách thiết lập quản lý dịch vụ được khuyến nghị cho ứng dụng đó.
Bước 3: Tạo cấu hình proxy ngược Nginx
Tạo một khối server mới cho Nginx:
sudo nano /etc/nginx/sites-available/app.example.com
Thay app.example.com bằng tên miền thực tế của bạn.
Thêm cấu hình sau:
server {
listen 80;
server_name app.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;
}
}
Lưu tệp.
Tìm hiểu cấu hình
listen 80tiếp nhận các yêu cầu HTTP.server_namechỉ định tên miền mà Nginx sẽ xử lý.proxy_passchuyển tiếp yêu cầu đến ứng dụng trên cổng 3000.proxy_set_headerchuyển thông tin hữu ích về yêu cầu ban đầu đến backend.
Backend phải hiểu và xử lý an toàn các header được chuyển tiếp. Chỉ cấu hình ứng dụng tin cậy những header này khi yêu cầu đi qua proxy đáng tin cậy của bạn.
Bước 4: Bật và kiểm tra cấu hình
Bật khối server mới của bạn:
sudo ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/
Nếu liên kết đã tồn tại, đừng tạo lại.
Kiểm tra cấu hình để phát hiện lỗi:
sudo nginx -t
Nếu quá trình kiểm tra thành công, hãy tải lại cấu hình Nginx:
sudo systemctl reload nginx
Bây giờ, hãy mở:
http://app.example.com
Nếu DNS trỏ đến đúng máy chủ và ứng dụng backend thử nghiệm vẫn đang chạy, bạn sẽ thấy:
Nginx Reverse Proxy Works!
Nếu trang Nginx mặc định xuất hiện thay vào đó, hãy kiểm tra bản ghi DNS của tên miền và cấu hình server_name.
Bước 5: Bật HTTPS bằng Let’s Encrypt
Đối với trang web công khai, hãy dùng HTTPS thay vì để lưu lượng truy cập không được mã hóa.
Trước tiên, hãy xác nhận tên miền của bạn phân giải đến đúng máy chủ và cổng 80 cho kết nối đến có thể truy cập được. Đây là những điều kiện quan trọng đối với quy trình xác thực chứng chỉ HTTP tiêu chuẩn.
Cài đặt Certbot theo phương pháp chính thức sử dụng Snap:
sudo snap install --classic certbot
Nếu lệnh certbot chưa khả dụng, hãy tạo liên kết cho lệnh:
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
Sau đó, yêu cầu cấp chứng chỉ:
sudo certbot --nginx -d app.example.com
Làm theo các lời nhắc. Certbot có thể lấy chứng chỉ và cấu hình Nginx để cung cấp tên miền của bạn qua HTTPS.
Sau đó, hãy kiểm tra việc gia hạn chứng chỉ:
sudo certbot renew --dry-run
Truy cập:
https://app.example.com
Ứng dụng thử nghiệm của bạn giờ sẽ tải qua kết nối được mã hóa.
Bước 6: Xác minh proxy ngược
Kiểm tra phản hồi HTTPS:
curl -I https://app.example.com
Với backend Python trong ví dụ này, phản hồi HTTP 200 OK cho biết yêu cầu đã đến ứng dụng thành công.
Bạn cũng có thể kiểm tra những tiến trình đang lắng nghe trên máy chủ:
sudo ss -ltnp
Nginx đã cài đặt sẽ lắng nghe trên các cổng HTTP và HTTPS công khai đã cấu hình, còn backend trong ví dụ lắng nghe trên 127.0.0.1:3000.
Lưu ý rằng máy chủ Python tạm thời sẽ dừng khi bạn kết thúc phiên terminal của nó. Các ứng dụng chạy trong môi trường production nên hoạt động dưới sự quản lý của một trình giám sát tiến trình như systemd.
Các sự cố thường gặp với proxy ngược Nginx
502 Bad Gateway
Lỗi này thường có nghĩa là Nginx không nhận được phản hồi hợp lệ từ backend.
Hãy kiểm tra ứng dụng của bạn có đang chạy hay không và cổng trong proxy_pass có chính xác hay không.
Hướng dẫn của chúng tôi về cách khắc phục lỗi 502 Bad Gateway trong Nginx đề cập chi tiết hơn đến nhật ký, các dịch vụ upstream và sự cố kết nối.
504 Gateway Timeout
Lỗi 504 xảy ra khi gateway không nhận được phản hồi cần thiết từ upstream đúng thời hạn.
Hãy tìm nguyên nhân khiến yêu cầu ứng dụng xử lý chậm và kiểm tra hiệu suất backend trước khi tăng thời gian chờ.
Xem hướng dẫn khắc phục lỗi 504 Gateway Timeout của chúng tôi để biết thêm cách xử lý.
Không truy cập được tên miền
Hãy kiểm tra bản ghi A của tên miền có trỏ đến đúng địa chỉ IP công khai hay không, các cổng liên quan trên tường lửa đã được mở hay chưa và khối server của Nginx có khớp với tên máy chủ được yêu cầu hay không.
Câu hỏi thường gặp
proxy_pass cho Nginx biết nơi cần chuyển tiếp yêu cầu, chẳng hạn một ứng dụng HTTP chạy trên 127.0.0.1:3000.
Có. Bạn có thể cấu hình các tên miền, tên miền phụ hoặc đường dẫn URL riêng biệt để chuyển tiếp yêu cầu đến các ứng dụng backend khác nhau.
Không. Bạn có thể kiểm tra proxy ngược bằng địa chỉ IP hoặc trong môi trường cục bộ. Tuy nhiên, tên miền giúp việc cung cấp dịch vụ công khai và lấy chứng chỉ HTTPS tiêu chuẩn trở nên đơn giản hơn.
Có. Nginx mã nguồn mở hỗ trợ chức năng proxy ngược mà không cần giấy phép thương mại.
Kết luận
Bạn đã cấu hình proxy ngược Nginx trên Ubuntu, chuyển tiếp yêu cầu đến một ứng dụng cục bộ và bật HTTPS.
Bạn có thể áp dụng cấu hình cơ bản tương tự cho Node.js, Python và các ứng dụng dựa trên HTTP khác bằng cách cập nhật địa chỉ backend trong proxy_pass.
Trước khi sử dụng cách thiết lập này trong môi trường production, hãy đảm bảo ứng dụng tự động khởi động, chạy với quyền phù hợp và có các biện pháp giám sát, bảo mật đầy đủ.