AI Automation

Cấu hình Nginx reverse proxy và SSL Let's Encrypt cho n8n

Bạn vừa cài xong n8n trên VPS bằng Docker Compose và nó chạy ngon lành trên cổng 5678. Nhưng truy cập qua http://IP_VPS:5678 vừa khó nhớ, vừa không an toàn nếu workflow của bạn xử lý dữ liệu nhạy cảm. Bước tiếp theo hiển nhiên là đặt n8n sau một reverse proxy (Nginx) với HTTPS. Bài này hướng dẫn bạn cấu hình Nginx reverse proxy và SSL Let's Encrypt cho n8n self-host trên VPS Ubuntu 24.04. Bạn sẽ có webhook n8n chạy trên cổng 443, SSL tự động gia hạn, sẵn sàng cho production.

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

  • Một VPS đang chạy Ubuntu 24.04 LTS với user sudo (không chạy root trực tiếp).
  • n8n đã được cài đặt và chạy thành công (qua Docker Compose hoặc Docker run), đang lắng nghe trên localhost:5678.
  • Tên miền đã trỏ bản ghi A về địa chỉ IPv4 của VPS. Ví dụ: n8n.tenmiencuaban.com.
  • Cổng 80 và 443 mở trên firewall (ufw hoặc iptables).

Vì sao nên dùng Nginx reverse proxy cho n8n?

n8n tự nó là một Node.js app chạy ổn định, nhưng không phải web server chuyên nghiệp. Đặt Nginx trước n8n giải quyết nhiều việc: termination SSL (xử lý HTTPS), giới hạn kích thước payload (client_max_body_size), chặn request độc hại ở tầng HTTP, và có thể thêm basic auth hoặc rate limit trước khi request chạm tới n8n. Nginx cũng giúp bạn expose multiple services trên cùng một VPS qua các subdomain khác nhau, cần thiết khi bạn tự host thêm Grafana, Uptime Kuma, hoặc Minio bên cạnh n8n.

Bước 1 - Cài đặt Nginx và Certbot

Đảm bảo VPS đã cập nhật package:

sudo apt update && sudo apt upgrade -y

Cài Nginx:

sudo apt install nginx -y

Bật và kiểm tra Nginx:

sudo systemctl enable --now nginx
sudo systemctl status nginx

Output mong đợi: active (running).

Thêm repo Certbot cho Nginx (bản PPA mới nhất, hỗ trợ Ubuntu 24.04):

sudo apt install certbot python3-certbot-nginx -y

Công cụ certbot sẽ tự động lấy chứng chỉ và cập nhật cấu hình Nginx cho bạn, nhưng trong bài này mình vẫn hướng dẫn cấu hình thủ công trước để bạn hiểu rõ.

Bước 2 - Cấu hình Nginx reverse proxy cho n8n

Tạo file cấu hình cho subdomain n8n:

sudo nano /etc/nginx/sites-available/n8n.tenmiencuaban.com

Nội dung file:

server {
    listen 80;
    server_name n8n.tenmiencuaban.com;

    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;

        # Giới hạn kích thước upload (n8n cần cho webhook/file)
        client_max_body_size 50m;
    }
}

Giải thích một số dòng quan trọng:
proxy_pass http://127.0.0.1:5678; chuyển request tới n8n đang chạy local.
proxy_set_header Upgrade/Connection cần thiết nếu n8n dùng WebSocket (ví dụ cho real-time update trên UI).
proxy_set_header Host $host giữ đúng hostname gốc để n8n generate đúng URL.
client_max_body_size 50m; n8n có thể nhận webhook với body lớn, đừng giới hạn ở mặc định 1M.

Kích hoạt site:

sudo ln -s /etc/nginx/sites-available/n8n.tenmiencuaban.com /etc/nginx/sites-enabled/
sudo nginx -t

Nếu nhận syntax is ok, test is successful, reload Nginx:

sudo systemctl reload nginx

Kiểm tra: mở browser gõ http://n8n.tenmiencuaban.com, bạn sẽ thấy giao diện n8n (chưa an toàn).

Bước 3 - Cấp chứng chỉ SSL Let's Encrypt tự động

Chạy Certbot với plugin Nginx:

sudo certbot --nginx -d n8n.tenmiencuaban.com

Lần đầu chạy, Certbot sẽ hỏi email (để thông báo hết hạn) và đồng ý điều khoản. Quan trọng nhất là hỏi bạn có muốn chuyển hướng HTTP→HTTPS không. Trả lời 2 (Redirect).

Sau khi chạy xong, Certbot tự động:

  • Gọi Let's Encrypt để xác thực quyền sở hữu domain.
  • Cấp chứng chỉ và đặt vào /etc/letsencrypt/live/n8n.tenmiencuaban.com/.
  • Chỉnh sửa file Nginx của bạn: thêm block SSL, trỏ tới chứng chỉ, và thêm redirect HTTP→HTTPS.

Kiểm tra file cấu hình xem Certbot đã sửa đúng chưa:

sudo cat /etc/nginx/sites-available/n8n.tenmiencuaban.com

Bạn sẽ thấy Nginx đã bao gồm block listen 443 ssl và đường dẫn chứng chỉ.

Kiểm tra HTTPS:

curl -I https://n8n.tenmiencuaban.com

Output phải chứa HTTP/2 200 và header X-Frame-Options từ n8n.

Bước 4 - Cấu hình tự động gia hạn SSL

Certbot tự động tạo systemd timer khi cài (hoặc bạn có thể dùng cron). Kiểm tra xem timer đã có chưa:

sudo systemctl status certbot.timer

Output mong đợi: Loaded: loadedActive: active (waiting). Timer mặc định chạy 2 lần/ngày.

Bạn có thể kích hoạt thủ công nếu chưa có:

sudo certbot renew --dry-run

Lệnh trên không cấp chứng chỉ mới, chỉ kiểm tra quy trình renew có chạy trơn tru không. Nếu không có lỗi, bạn yên tâm, SSL sẽ tự động gia hạn trước 30 ngày hết hạn.

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

Nếu bạn dùng ufw (mặc định trên Ubuntu 24.04), cần cho phép Nginx Full:

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

Kiểm tra rule:

sudo ufw status numbered

Bạn sẽ thấy cổng 80 và 443 đã mở cho Nginx.

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

Lỗi 502 Bad Gateway

Nguyên nhân: Nginx không kết nối được tới n8n. Kiểm tra n8n có chạy không:

sudo docker ps | grep n8n

Nếu container đã chạy, kiểm tra cổng n8n có đúng 5678 không:

sudo docker logs n8n_container_name | head -20

Kiểm tra lỗi từ Nginx:

sudo tail -f /var/log/nginx/error.log

Lỗi "certbot: command not found"

Nguyên nhân: chưa thêm repo hoặc dùng snap trên Ubuntu 24.04. Nếu apt không có, cài qua snap:

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Lỗi "too many redirects" khi truy cập

Nguyên nhân thường do n8n chạy sau reverse proxy và sinh URL HTTP ở header redirect. Cần đảm bảo n8n biết nó đang chạy sau proxy HTTPS. Thêm biến môi trường vào Docker Compose (trong file docker-compose.yml của n8n):

environment:
  - N8N_PROTOCOL=https
  - N8N_HOST=n8n.tenmiencuaban.com

Sau đó restart container:

sudo docker compose down && sudo docker compose up -d

Câu hỏi thường gặp

Có cần expose cổng 5678 ra public không?

Không. Sau khi cấu hình Nginx, n8n chỉ cần lắng nghe trên 127.0.0.1:5678. Nếu bạn expose cổng đó ra public, bạn sẽ bỏ qua proxy và mất tác dụng của SSL cũng như bảo mật tầng HTTP.

N8n có hỗ trợ WebSocket không? Cần cấu hình gì thêm?

Có, n8n dùng WebSocket cho tính năng real-time update trên editor UI. Cấu hình trong bài đã có dòng proxy_set_header UpgradeConnection "upgrade", đó là đủ. Bạn không cần thêm gì.

SSL Let's Encrypt có miễn phí lâu dài không?

Chứng chỉ Let's Encrypt miễn phí và có thời hạn 90 ngày. Certbot tự động gia hạn nếu bạn cấu hình timer/cron. Miễn là domain của bạn còn hoạt động và bạn duy trì VPS, SSL sẽ tự động được làm mới trước khi hết hạn.

Nếu có nhiều subdomain trên cùng VPS thì làm thế nào?

Tạo file cấu hình riêng cho từng subdomain trong /etc/nginx/sites-available/, mỗi file có block server_name riêng và proxy_pass trỏ tới service tương ứng. Certbot cho phép cấp 1 chứng chỉ cho nhiều domain cùng lúc: sudo certbot --nginx -d sub1.tenmien.com -d sub2.tenmien.com.

Bài viết liên quan

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ế.