Nginx Proxy Manager (NPM):可视化反代神器
如果你觉得 Traefik 配置太抽象,或者群晖自带的反向代理功能不够强大(不支持自动申请泛域名证书、访问控制弱),那么 Nginx Proxy Manager (NPM) 是你的最佳选择。它拥有一个漂亮的 Web 界面,让你点点鼠标就能配置反向代理、申请 SSL 证书、设置访问权限。
为什么选择 NPM?
- 可视化管理:所有操作都在网页上完成,适合新手。
- 自动 SSL:内置 Let's Encrypt 支持,自动申请和续期证书。
- 泛域名支持:支持 DNS Challenge,轻松申请
*.yourdomain.com证书。 - 访问控制:支持 Basic Auth(密码保护)和 IP 白名单。
1. 部署 NPM (Docker Compose)
NPM 需要一个数据库(SQLite 或 MySQL)。推荐使用 MySQL 以获得更好的性能。
准备工作
- 在
/volume1/docker/下创建npm目录。 - 创建
docker-compose.yml文件。
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # HTTP 端口
- '81:81' # 管理后台端口
- '443:443' # HTTPS 端口
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
volumes:
- ./mysql:/var/lib/mysql
networks:
default:
external: false
端口冲突解决
群晖 DSM 默认占用了 80 和 443 端口。 * 方案 A (推荐):修改 NPM 的端口映射,例如 8080:80 和 4443:443。然后在路由器上做端口转发:外网 80 -> 内网 8080,外网 443 -> 内网 4443。 * 方案 B (Macvlan):给 NPM 分配一个独立的局域网 IP,独占 80/443。
2. 初始化与配置
- 启动容器:
docker compose up -d - 访问管理后台:
http://nas-ip:81 - 默认账号:
- Email:
admin@example.com - Password:
changeme
- Email:
- 登录后务必修改邮箱和密码。
3. 申请泛域名 SSL 证书
这是 NPM 最强大的功能。
- 进入 SSL Certificates > Add SSL Certificate > Let's Encrypt。
- Domain Names: 输入
*.yourdomain.com和yourdomain.com。 - Email: 填你的邮箱。
- Use a DNS Challenge: 勾选。这是申请泛域名证书的关键。
- DNS Provider: 选择你的域名服务商(如 Cloudflare, Aliyun, Tencent Cloud)。
- Credentials File Content:
- 根据提示填入 API Token。
- 以 Cloudflare 为例:将
dns_cloudflare_api_token =后面的值换成你的 Token。
- 点击 Save。稍等片刻,证书申请成功。
4. 配置反向代理
现在我们把 NAS 上的 Jellyfin 暴露出去。
- 进入 Hosts > Proxy Hosts > Add Proxy Host。
- Details:
- Domain Names:
video.yourdomain.com - Scheme:
http - Forward Hostname / IP:
192.168.1.100(NAS IP) - Forward Port:
8096 - Cache Assets: 勾选(加速静态资源)。
- Block Common Exploits: 勾选(安全防护)。
- Websockets Support: 勾选(重要!Jellyfin 需要这个)。
- Domain Names:
- SSL:
- SSL Certificate: 选择刚才申请的泛域名证书。
- Force SSL: 勾选。
- HTTP/2 Support: 勾选。
- 点击 Save。
- 访问
https://video.yourdomain.com,成功!
5. 访问控制 (Access Lists)
有些服务(如 Portainer)不想公开,只想在公司访问。
- 进入 Access Lists > Add Access List。
- Name:
Company Only。 - Authorization:
- Username/Password: 可以设置账号密码(Basic Auth)。
- Access:
- allow:
1.2.3.4(公司公网 IP) - deny:
all
- allow:
- 回到 Proxy Hosts,编辑 Portainer 的规则,在 Access List 中选择
Company Only。
6. 常见问题
Q1: 证书续期失败?
- 检查 API Token 是否过期。
- 检查 DNS 解析是否正常。
- 查看容器日志:
docker logs npm-app-1。
Q2: 502 Bad Gateway?
- NPM 容器无法连接到目标 IP:端口。
- 如果目标也是 Docker 容器,确保它们在同一个 Docker 网络,或者使用宿主机 IP (
192.168.1.x) 而不是localhost。