Nginx Proxy Manager: Hướng dẫn Proxy & Cloudflare Tunnel
I. Giới thiệu Nginx Proxy Manager
Nginx Proxy Manager là một công cụ quản lý proxy được cài đặt trên Docker, cho phép bạn:
- Proxy các ứng dụng internal ra ngoài mạng
- Quản lý SSL certificate (tự động từ Let's Encrypt)
- Proxy domain local hoặc domain public từ Cloudflare Tunnel
- Cân bằng tải giữa nhiều backend
- Quản lý giao diện web dễ dàng
Lợi ích chính:
- Không cần sửa Nginx config thủ công
- Giao diện web dễ sử dụng
- Tự động gia hạn SSL certificate
- Hỗ trợ HTTP/2, WebSocket, Proxy Pass
II. Triển khai Nginx Proxy Manager với Portainer
1. Chuẩn bị Docker Compose
Dưới đây là file docker-compose.yml cho Nginx Proxy Manager:
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
privileged: true
ports:
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin UI
- '2223:22'
volumes:
- /root/nginxproxymanager/data:/data
- /root/nginxproxymanager/letsencrypt:/etc/letsencrypt
mem_limit: 1024m
cpus: 0.1
Giải thích cấu hình:
- Port 80/443: HTTP/HTTPS public (được reverse proxy qua)
- Port 81: Admin UI để quản lý
- Port 2223: SSH (tùy chọn)
- Volumes: Lưu cấu hình, database, và SSL certificates
- privileged: true: Cần quyền root để thao tác port 80/443
2. Deploy qua Portainer
Các bước triển khai:
- Vào Portainer Dashboard
- Chọn Stacks → Add stack
- Đặt tên Stack:
nginx-proxy-manager - Copy/paste nội dung docker-compose vào trường Web editor
- Click Deploy the stack
Đợi container khởi động xong, truy cập http://your-ip:81 để vào Admin UI.
3. Đăng nhập Admin UI lần đầu
Thông tin đăng nhập mặc định:
Email: [email protected] Password: changeme
Sau khi đăng nhập, hệ thống sẽ yêu cầu đổi mật khẩu. Hãy đặt mật khẩu mạnh.
III. Cấu hình Proxy cho Domain Local
1. Tạo Proxy Host cho Domain Local
Để proxy một ứng dụng local (ví dụ: app chạy trên port 3000):
- Vào Admin UI → Hosts → Proxy Hosts
- Click Add Proxy Host
- Điền thông tin:
- Domain Names:
app.local - Scheme:
http - Forward Hostname/IP:
192.168.1.100(IP máy chủ app) - Forward Port:
3000(port app) - Click Save
Lưu ý: Domain local phải được phân giải bởi DNS local (AdGuard Home) hoặc hosts file.
2. Cấu hình SSL cho Domain Local (Optional)
Nếu muốn HTTPS cho domain local:
- Vào Proxy Host vừa tạo → Click Edit
- Chọn tab SSL
- Chọn SSL Certificate: "Request a new SSL Certificate"
- Email:
[email protected] - Click Save
3. Test Proxy Local
Mở trình duyệt hoặc terminal test:
curl http://app.local # Hoặc nslookup app.local để kiểm tra DNS
IV. Proxy Domain Public từ Cloudflare Tunnel
1. Khái niệm Cloudflare Tunnel
Cloudflare Tunnel cho phép bạn:
- Expose ứng dụng private ra internet mà không cần open port trên router
- Sử dụng domain public được quản lý bởi Cloudflare
- Tự động HTTPS với Cloudflare SSL
- Bảo mật ngoài hộp (DDoS protection, WAF, ...)
2. Cấu hình Cloudflare Tunnel với Docker (Portainer)
Vì bạn đang dùng Portainer, hãy cài Cloudflare Tunnel qua Docker:
Bước 1: Tạo Tunnel trên Cloudflare Dashboard
- Đăng nhập Cloudflare Dashboard
- Chọn domain của bạn → Networks → Tunnel
- Click Create a tunnel
- Đặt tên:
my-tunnel - Chọn connector: Docker
- Copy token của tunnel (sẽ dùng ở bước sau)
Bước 2: Tạo Docker Compose cho Cloudflared
Tạo file docker-compose.yml riêng cho cloudflared:
version: '3.8'
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared-tunnel
restart: unless-stopped
command: tunnel run
environment:
- TUNNEL_TOKEN=YOUR_TUNNEL_TOKEN_HERE
mem_limit: 512m
cpus: 0.1
Hoặc dùng credentials.json (cách khác):
version: '3.8'
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared-tunnel
restart: unless-stopped
command: tunnel --no-autoupdate run --token YOUR_TUNNEL_TOKEN_HERE
volumes:
- /root/cloudflared/credentials.json:/root/.cloudflared/credentials.json
mem_limit: 512m
cpus: 0.1
Bước 3: Deploy qua Portainer
- Vào Portainer Dashboard
- Chọn Stacks → Add stack
- Đặt tên Stack:
cloudflared-tunnel - Copy/paste docker-compose vào Web editor
- Thay YOUR_TUNNEL_TOKEN_HERE bằng token từ Cloudflare
- Click Deploy the stack
Container sẽ khởi động và kết nối đến Cloudflare Tunnel của bạn.
Bước 4: Kiểm tra Tunnel hoạt động
Vào Cloudflare Dashboard → Tunnel → Chọn tunnel của bạn → kiểm tra status "HEALTHY".
Bước 5: Cấu hình Public Hostname
Trên Cloudflare Dashboard:
- Vào Tunnel → Public Hostname tab
- Click Add a public hostname
- Điền thông tin:
- Subdomain:
app - Domain:
yourdomain.com - Type:
HTTP - URL:
http://127.0.0.1:80(Nginx Proxy Manager) - Click Save
Lưu ý: URL phải trỏ đến Nginx Proxy Manager (port 80 hoặc 443) hoặc ứng dụng của bạn.
3. Tạo Proxy Host với Domain Public
Sau khi Cloudflare Tunnel hoạt động:
- Vào Admin UI → Hosts → Proxy Hosts
- Click Add Proxy Host
- Điền thông tin:
- Domain Names:
app.yourdomain.com - Scheme:
http - Forward Hostname/IP:
127.0.0.1 - Forward Port:
3000 - Tab SSL: Chọn "Let's Encrypt" hoặc "Cloudflare"
- Click Save
4. Cấu hình DNS Records trong Cloudflare
Bạn cần point domain đến Cloudflare Tunnel:
- Vào Cloudflare Dashboard → Domain
- Chọn DNS tab
- Thêm CNAME record:
- Name:
app - Target:
tunnel-name.cfargotunnel.com - Click Save
5. Test Domain Public
Sau vài phút, domain sẽ hoạt động:
curl https://app.yourdomain.com # Hoặc mở trình duyệt
V. Cấu hình Advanced
1. Custom Headers & Rewrite
Để thêm custom headers hoặc rewrite URL:
- Vào Proxy Host → Tab Advanced
- Thêm custom Nginx config nếu cần:
proxy_set_header X-Custom-Header "value"; proxy_set_header Host $host;
2. Cân bằng tải (Load Balancing)
Nếu có nhiều backend server:
- Vào Hosts → Upstream
- Tạo Upstream mới với nhiều server
- Proxy Host sẽ sử dụng Upstream này
3. Redirect & Access Control
Nginx Proxy Manager hỗ trợ:
- HTTP → HTTPS redirect: Tự động trong SSL tab
- Basic Auth: Bảo vệ proxy bằng username/password
- IP Whitelist/Blacklist: Giới hạn IP truy cập
VI. Lưu ý quan trọng
- Sao lưu cấu hình: Thư mục
/root/nginxproxymanager/datachứa database, nên backup định kỳ - Port 80/443: Phải open trên firewall/router nếu dùng domain public
- DNS local: Domain local phải được phân giải bởi DNS server (ví dụ AdGuard Home)
- Cloudflare Tunnel: Không cần open port, chỉ cần outbound connection
- SSL Certificate: Let's Encrypt certificates được tự động gia hạn
- Performance: Giữ container đủ RAM để xử lý requests
- Logs: Xem logs trong Admin UI → Logs tab để debug vấn đề
Vậy là bạn đã hoàn thành cấu hình Nginx Proxy Manager để proxy domain local và domain public từ Cloudflare Tunnel!