Nginx Proxy Manager (NPM) là lựa chọn đáng cân nhắc nếu bạn đang tìm một giải pháp để quản lý proxy ngược (reverse proxy) mà không cần đụng tay vào file cấu hình Nginx. Bài viết này hướng dẫn từng bước cài đặt NPM bằng Docker Compose, đồng thời trình bày cách xử lý lỗi 502 Bad Gateway, vấn đề phổ biến nhất khi vận hành proxy ngược.
Nginx Proxy Manager là gì?
Nginx Proxy Manager là ứng dụng web chạy trên Docker, cung cấp giao diện đồ họa để quản lý proxy ngược mà không cần chỉnh sửa file cấu hình Nginx thủ công.
Nếu bạn chưa quen với khái niệm này, có thể đọc thêm proxy ngược là gì trước khi tiếp tục. Còn nếu đã rõ, phần tiếp theo đi thẳng vào cài đặt.

Yêu cầu trước khi cài đặt
Phần cứng tối thiểu
| Thành phần | Tối thiểu | Khuyến nghị |
| RAM | 512 MB | 1 GB trở lên |
| CPU | 1 core | 2 cores (traffic cao) |
| Disk | 600 MB | 2 GB (logs, SSL, DB) |
| Network | Port 80, 81, 443 trống | — |
Phần mềm
- Docker Engine 20.10.0 trở lên
- Docker Compose v2.0 trở lên
- Linux Kernel 3.10 trở lên
Triển khai trên Ubuntu? Trước khi chạy NPM, đảm bảo môi trường đã được cấu hình đúng. Hướng dẫn cài proxy cho Ubuntu sẽ giúp bạn thiết lập network stack và các gói phụ thuộc cần thiết trên Ubuntu 20.04/22.04/24.04 trước khi tiến hành các bước dưới đây.
Hướng dẫn cài đặt Nginx Proxy Manager bằng Docker Compose
Quá trình cài đặt gồm 7 bước, từ tạo thư mục đến đăng nhập và đổi mật khẩu mặc định.
Bước 1: Tạo thư mục làm việc
mkdir -p ~/nginx-proxy-manager && cd ~/nginx-proxy-manager
Flag -p đảm bảo lệnh không báo lỗi nếu thư mục đã tồn tại.
Bước 2: Tạo file docker-compose.yml
nano docker-compose.yml
Dán nội dung sau vào file:
version: ‘3.8’
services:
nginx-proxy-manager:
image: ‘jc21/nginx-proxy-manager:2.11.3’ # Dùng version cụ thể thay vì ‘latest’ trong production
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
– ’80:80′
– ’81:81′
– ‘443:443’
volumes:
– ./data:/data
– ./letsencrypt:/etc/letsencrypt
environment:
TZ: ‘Asia/Ho_Chi_Minh’
Giải thích các tham số chính:
- image: Nên chỉ định version cụ thể (ví dụ 2.11.3) thay vì latest để tránh breaking change khi image upstream cập nhật. Kiểm tra phiên bản mới nhất tại GitHub releases của NPM.
- restart: unless-stopped: Container tự khởi động lại khi server reboot, trừ khi bạn chủ động dừng nó.
- ports: Map port từ host vào container (port 80 cho HTTP, 81 cho admin UI, 443 cho HTTPS).
- volumes: Mount data ra ngoài host để dữ liệu tồn tại ngay cả khi container bị xóa và tạo lại.
Lưu file: Ctrl + X → Y → Enter.

Bước 3: Khởi chạy container
docker compose up -d
Lệnh này pull image từ Docker Hub và start container ở chế độ nền (detached).
Bước 4: Kiểm tra trạng thái
docker compose ps
Cột Status phải hiển thị Up. Xem log realtime để xác nhận không có lỗi:
docker compose logs -f
Nhấn Ctrl + C để thoát khỏi chế độ theo dõi log.
Bước 5: Truy cập giao diện quản trị
Mở trình duyệt và vào:
http://YOUR-SERVER-IP:81
Ví dụ: http://192.168.1.100:81
Bước 6: Đăng nhập lần đầu
Dùng thông tin mặc định:
- Email: admin@example.com
- Password: changeme
Bước 7: Đổi thông tin đăng nhập ngay
Hệ thống sẽ yêu cầu đổi mật khẩu sau lần đăng nhập đầu tiên:
- Nhập email thực của bạn
- Điền First Name và Last Name
- Đặt mật khẩu mạnh (tối thiểu 8 ký tự, có chữ hoa, số và ký tự đặc biệt)
- Nhấn Save
Sau bước này, NPM đã sẵn sàng để tạo proxy host đầu tiên.
Khắc phục lỗi 502 Bad Gateway trong Nginx Proxy Manager
Lỗi 502 xảy ra khi Nginx không thể kết nối hoặc nhận phản hồi hợp lệ từ backend service. Dưới đây là 5 nguyên nhân phổ biến và cách xử lý từng trường hợp.
Nguyên nhân 1: Backend service không chạy
Đây là nguyên nhân thường gặp nhất. Backend container có thể đã crash hoặc chưa được khởi động.
Kiểm tra:
docker ps | grep your-service-name
curl http://localhost:8080 # Test trực tiếp backend
Khắc phục:
# Nếu chạy container đơn lẻ
docker restart your-backend-container
# Nếu dùng docker-compose
docker compose -f /path/to/backend/docker-compose.yml restart
Nguyên nhân 2: Sai scheme (HTTP vs HTTPS)
NPM forward theo HTTP nhưng backend chỉ chấp nhận HTTPS, hoặc ngược lại.
Khắc phục:
- Vào NPM dashboard → click Edit trên proxy host bị lỗi
- Chọn tab Details
- Đổi Scheme từ http sang https hoặc ngược lại
- Nhấn Save và test lại
Nguyên nhân 3: Sai hostname hoặc port
Trong môi trường Docker, dùng localhost hoặc 127.0.0.1 làm Forward Hostname sẽ không hoạt động (container không thể resolve địa chỉ này thành host machine).
Không dùng:
localhost:8080
127.0.0.1:8080
Thay bằng:
container-name:8080 # Nếu cùng Docker network
172.17.0.x:8080 # Docker bridge IP cụ thể
Tìm IP của backend container:
docker inspect your-container | grep IPAddress
Nguyên nhân 4: Docker network isolation
NPM và backend chạy trên hai Docker network riêng biệt nên không thể giao tiếp với nhau.
Xem danh sách networks:
docker network ls
Kết nối backend vào network của NPM:
docker network connect nginx-proxy-manager_default backend-container
Xác nhận kết nối:
docker network inspect nginx-proxy-manager_default
Nguyên nhân 5: Vấn đề SSL certificate
Backend dùng self-signed certificate và NPM từ chối kết nối vì không tin tưởng certificate đó.
Khắc phục bằng cách tắt SSL verification:
- Edit proxy host → tab Advanced
- Thêm vào Custom Nginx Configuration:
proxy_ssl_verify off;
Nếu backend xử lý lâu và timeout trước khi trả kết quả:
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
- Nhấn Save
Xem log để chẩn đoán chính xác
docker compose logs -f nginx-proxy-manager
Log sẽ cho thấy error message cụ thể như Connection refused, upstream timed out hoặc SSL handshake failed. Từ đó xác định đúng nguyên nhân mà không cần đoán mò.
Nâng cao hiệu quả với proxy bổ trợ
NPM xử lý rất tốt vai trò proxy ngược nội bộ. Tuy nhiên, với các hệ thống cần ẩn IP gốc, phân tải từ nhiều địa điểm, hoặc truy cập API có giới hạn IP, bạn sẽ cần thêm một lớp proxy phía trước.
Gợi ý: 1024 Proxy datacenter cho server cung cấp địa chỉ IP datacenter tốc độ cao, độ trễ thấp, phù hợp để đặt trước NPM như một outbound proxy layer. Phù hợp cho cả môi trường development lẫn production cần IP ổn định.
Nếu đội ngũ của bạn đang mở rộng hạ tầng và cần giải pháp proxy cho nhiều máy chủ cùng lúc, tham khảo thêm gói mua proxy cho doanh nghiệp, được thiết kế riêng cho nhu cầu quản lý proxy theo đội nhóm với dashboard tập trung và SLA rõ ràng.
Câu hỏi thường gặp
Dưới đây là các câu hỏi người dùng thường băn khoăn, đặc biệt là khi mới tập sử dụng NPM.
Nginx Proxy Manager có miễn phí không?
Có. NPM là phần mềm mã nguồn mở theo giấy phép MIT, miễn phí hoàn toàn cho cả mục đích cá nhân lẫn thương mại. Không có phiên bản trả phí hay tính năng bị giới hạn.
NPM khác gì so với cấu hình Nginx trực tiếp?
Nginx là web server/proxy ngược yêu cầu chỉnh sửa file cấu hình bằng tay và hiểu cú pháp riêng của nó. NPM là lớp giao diện đồ họa đặt lên trên Nginx, tự động sinh config và quản lý SSL mà không cần kiến thức về cú pháp Nginx.
NPM có hỗ trợ IPv6 không?
Có, NPM hỗ trợ IPv6 mặc định. Để tắt, thêm vào docker-compose.yml:
environment:
DISABLE_IPV6: ‘true’
Có thể cài NPM không dùng Docker không?
Không được khuyến nghị. NPM được thiết kế đặc thù để chạy trên Docker; cài đặt bare-metal yêu cầu compile từ source, cài nhiều dependency thủ công và không được developer hỗ trợ chính thức.
Nên dùng version nào trong production?
Tránh dùng tag latest trong môi trường production vì image có thể cập nhật tự động gây ra lỗi không mong muốn. Luôn ghim một version cụ thể và nâng cấp có kiểm soát sau khi test trước.
Tổng kết
Nginx Proxy Manager rút ngắn đáng kể thời gian thiết lập proxy ngược so với cấu hình Nginx truyền thống. Với 7 bước cài đặt trên Docker Compose, bạn có ngay một hệ thống proxy quản lý được qua web, tích hợp SSL Let’s Encrypt miễn phí.
Để đi sâu hơn, các tính năng như Access Lists, Custom SSL wildcard và Stream TCP/UDP của NPM mở ra nhiều khả năng kiểm soát hạ tầng proxy mà bài viết này chưa đề cập hết. Bạn cũng có thể đọc bài so sánh proxy chuyển tiếp và proxy ngược để có thêm cái nhìn khách quan.
Ngoài ra, danh mục hướng dẫn của chúng tôi còn tổng hợp nhiều bài viết hữu ích khác dành cho các bạn tự vận hành VPS, homelab hoặc hạ tầng nội bộ.

Để lại một bình luận