Linux

Cấu hình Nginx làm reverse proxy trên Ubuntu 24.04

Bạn có một ứng dụng web chạy trên cổng 3000 (Node.js, Python Flask, hoặc bất kỳ framework nào), và bạn muốn trỏ tên miền về VPS, chạy HTTPS, và cache tĩnh? Cách đơn giản nhất là đặt Nginx ở phía trước làm reverse proxy. Ubuntu 24.04 LTS là bản phát hành mới nhất với kernel 6.8 và hỗ trợ dài hạn, thích hợp để chạy production. Bài này sẽ hướng dẫn bạn từ VPS trắng (Ubuntu 24.04) đến Nginx reverse proxy hoạt động, có verify từng bước.

Yêu cầu trước khi bắt đầu

  • Một VPS chạy Ubuntu 24.04 LTS (mới cài, chưa cấu hình gì).
  • Quyền root hoặc user sudo (ví dụ user deploy).
  • Một ứng dụng web đang chạy trên cổng cụ thể (ví dụ localhost:3000), nếu chưa có, ta sẽ dùng Nginx mặc định để test.
  • Tên miền đã trỏ A record về IP VPS (tùy chọn, nhưng nên có để kiểm tra HTTPS sau này).

Khi nào cần Nginx reverse proxy

Việc chạy ứng dụng trực tiếp trên cổng 80/443 (dùng app.listen(80) trong Node.js) có thể gặp vấn đề: ứng dụng không handle HTTP/1.1 keep-alive tối ưu, không cache, không dễ dàng terminate SSL, không thể phân tải. Đặt Nginx phía trước giải quyết tất cả: SSL termination bằng Certbot, caching static assets, load balancing, và dễ dàng chuyển hướng qua nhiều backend. Nginx hoạt động như một lớp trung gian: nhận request từ client, chuyển tiếp (proxy_pass) tới ứng dụng backend, rồi gửi response về client.

Bước 1 - Cài đặt Nginx và kiểm tra dịch vụ

Cập nhật package và cài Nginx từ repo chính thức Ubuntu 24.04 (phiên bản sẽ là nginx/1.24.x).

sudo apt update
sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

Kiểm tra trạng thái:

sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since ...

Nếu bạn thấy active (running), mở trình duyệt gõ http://<IP_VPS>, bạn sẽ thấy trang chào mừng Nginx. Nếu không, kiểm tra firewall (ufw) có mở cổng 80 không.

Bước 2 - Mở port trên firewall (ufw)

Ubuntu 24.04 thường bật ufw mặc định. Nếu bạn gặp lỗi connection refused trên cổng 80, hãy mở:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload

Kiểm tra rule:

sudo ufw status verbose
Status: active
To                         Action      From
--                         ------      ----
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

Nếu ufw chưa bật, bạn có thể bật sau khi chắc chắn cổng SSH đã được cho phép:

sudo ufw allow 22/tcp
sudo ufw enable

Bước 3 - Tạo ứng dụng backend thử (tùy chọn)

Nếu bạn chưa có ứng dụng backend thật để proxy, tạo một file test bằng Python để mô phỏng:

sudo mkdir -p /var/www/backend
cd /var/www/backend
sudo python3 -m http.server 3000 &

Kiểm tra bằng curl localhost:3000, bạn sẽ thấy nội dung thư mục /var/www/backend. Hoặc nếu bạn có Node.js app đang chạy trên cổng 3000, bỏ qua bước này.

Ghi chú: Trong thực tế, bạn nên quản lý backend bằng systemd hoặc process manager (PM2, supervisor) thay vì chạy background bằng &.

Bước 4 - Cấu hình Nginx reverse proxy

Nginx lưu cấu hình server block trong /etc/nginx/sites-available/. Ta sẽ tạo một file mới cho tên miền (hoặc nếu chỉ dùng IP, đặt tên tùy ý).

sudo nano /etc/nginx/sites-available/reverse-proxy

Dán nội dung sau:

server {
    listen 80;
    server_name _;  # Thay bằng domain của bạn: vd 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;
    }

    # Tùy chọn: cache tĩnh
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        proxy_pass http://127.0.0.1:3000;
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }
}

Giải thích các header: Host $host giữ nguyên tên miền gốc; X-Real-IP ghi IP thật của client; X-Forwarded-For thêm IP vào chuỗi; X-Forwarded-Proto ghi lại giao thức (HTTP/HTTPS). Nếu thiếu các header này, ứng dụng backend sẽ không biết IP thật của client và không thể redirect đúng sang HTTPS.

Kích hoạt site bằng cách tạo symbolic link vào sites-enabled:

sudo ln -s /etc/nginx/sites-available/reverse-proxy /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default  # Xóa config mặc định

Kiểm tra cấu hình Nginx trước khi reload:

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nếu có lỗi, kiểm tra dấu chấm phẩy, hoặc port backend. Sau đó reload Nginx:

sudo systemctl reload nginx

Bước 5 - Verify reverse proxy hoạt động

Mở trình duyệt gõ http://<IP_VPS> hoặc tên miền đã trỏ. Lúc này, Nginx sẽ chuyển tiếp yêu cầu tới 127.0.0.1:3000. Nếu bạn đang chạy Python http.server test, bạn sẽ thấy danh sách thư mục.

Kiểm tra log Nginx để chắc chắn request đã được proxy:

sudo tail -f /var/log/nginx/access.log | grep 3000

Hoặc dùng curl để xem header response:

curl -I http://localhost
HTTP/1.1 200 OK
Server: nginx/1.24.0
...
X-Cache-Status: MISS

Bạn sẽ thấy header Server: nginx (không phải server của backend). Nếu backend trả về nội dung, Nginx đã proxy thành công.

Xử lý lỗi thường gặp

502 Bad Gateway: Nginx không thể kết nối tới backend. Nguyên nhân thường là backend chưa chạy hoặc sai cổng. Kiểm tra:

sudo journalctl -u nginx | grep "connect() failed"
2024/04/01 10:00:00 [error] 1234#1234: *1 connect() failed (111: Connection refused) while connecting to upstream, client: ...

Sửa bằng cách chắc chắn backend đang chạy trên đúng 127.0.0.1:3000 (dùng ss -tlnp | grep 3000).

404 Not Found khi truy cập: Xảy ra khi backend trả về 404 hoặc file tĩnh không được proxy đúng. Kiểm tra log backend và đảm bảo location / được khớp.

ERR_TOO_MANY_REDIRECTS: Thường do thiếu header X-Forwarded-Proto khi backend cố redirect HTTP→HTTPS. Thêm dòng proxy_set_header X-Forwarded-Proto $scheme; vào block location, và cấu hình backend tin tưởng header này.

Bước 6 - (Tùy chọn) Thêm SSL với Certbot

Để chạy HTTPS, cài Certbot cho Nginx:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com

Certbot sẽ tự động sửa cấu hình Nginx để thêm listen 443 ssl; và redirect HTTP sang HTTPS. Sau khi chạy xong, kiểm tra lại nginx -t và reload. Đây là bước quan trọng nếu bạn muốn bảo mật kết nối với người dùng.

Kết luận

Reverse proxy với Nginx là một kỹ năng cơ bản mà bất kỳ sysadmin nào cũng cần nắm. Trên Ubuntu 24.04, mọi thao tác đều rõ ràng, từ cài đặt đến cấu hình proxy_pass và xử lý lỗi. Sau khi hoàn thành, bạn có thể mở rộng: thêm load balancing bằng upstream block, cấu hình cache nâng cao, hoặc tích hợp với WordPress trên VPS để tối ưu hiệu năng. Nếu bạn cần một VPS ổn định để deploy, hãy cân nhắc dùng thueVPS với hạ tầng NVMe và IPv4 Việt Nam, phù hợp cho các ứng dụng cần độ trễ thấp.

Tại sao nên dùng Nginx làm reverse proxy thay vì Apache?

Nginx xử lý concurrent connections tốt hơn nhờ event-driven architecture, tiêu thụ ít RAM hơn Apache khi cùng số lượng request. Đặc biệt phù hợp cho static file serving và proxy.

Có cần mở thêm port nào trên ufw không?

Nếu bạn chỉ chạy HTTP/HTTPS, chỉ cần mở 80 và 443. Backend chạy trên cổng nội bộ (127.0.0.1) nên không cần mở firewall cho backend.

Làm sao để biết request thực sự đi qua reverse proxy?

Kiểm tra log access của Nginx tại /var/log/nginx/access.log và log của backend (nếu có). Nếu thấy IP của Nginx (127.0.0.1) trong log backend, tức là request đã được proxy.

Nginx reverse proxy có hỗ trợ WebSocket không?

Có, bạn cần thêm header Upgrade $http_upgradeConnection "upgrade" trong block location. Nginx sẽ chuyển tiếp kết nối WebSocket tới backend.

Bài viết liên quan

  • Cấu hình Nginx làm reverse proxy trên Ubuntu (bài chi tiết về caching nâng cao)
  • Hướng dẫn cài đặt WordPress trên VPS
  • So sánh VPS quốc tế và VPS Việt Nam
  • Bảo mật SSH cho VPS Linux
Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.