[Hướng dẫn] Chi tiết cách cấu hình Nginx làm Reverse Proxy trên Ubuntu

  • Người khởi tạo Người khởi tạo anhptt
  • Ngày bắt đầu Ngày bắt đầu
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ụ: 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ó:
  1. Một server đang chạy Ubuntu 22.04 hoặc 24.04 LTS.
  2. 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).
  3. 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
Nếu thấy dòng chữ Active: active (running) là thành công.



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_pass là 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 HTTPBiến Nginx tương ứngÝ nghĩa
Host$http_hostTên miền và cổng gốc mà người dùng yêu cầu.
X-Real-IP$remote_addrIP thật duy nhất của người dùng cuối.
X-Forwarded-For$proxy_add_x_forwarded_forIP của người dùng, bao gồm cả chuỗi IP nếu qua nhiều proxy.
X-Forwarded-Proto$schemeGiao 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
Nếu kết quả báo syntax is ok, hãy khởi động lại Nginx:
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 config proxy_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é!
 
Back
Top Dưới