一、为什么我们需要 Nginx Proxy Manager?
在 Linux VPS 上托管多个 Docker 容器服务(如个人博客、面板、自建网盘或 API 后端)时,传统的 Nginx 配置往往成为运维人员的梦魇:
- 手写
nginx.conf极易出错:稍有不慎遗漏分号或匹配规则冲突,执行nginx -s reload就会导致全站瘫痪; - SSL 证书繁琐难管:每新增一个二级域名就得手动申请一次 Let's Encrypt 证书,Certbot 自动续期经常因 HTTP 挑战失败而发生突发性证书过期红标;
- 权限门禁难以精细控制:想要给特定管理面板(如数据库管理或监控)增加内网 IP 白名单或 HTTP Basic Auth,必须查阅大量晦涩的 Nginx 指令。
Nginx Proxy Manager(简称 NPM) 是基于 Docker 打造的一款全功能图形化反向代理管理平台。它将强大的 OpenResty / Nginx 内核与直观的 Web 可视化 UI 完美融合,让我们在网页点选之间即可完成多域名反代、自动申请泛域名 SSL、跨域配置以及 IP 访问控制黑白名单!
二、系统架构与端口依赖对照
| 服务组件 | 内部监听端口 | 宿主机映射端口 | 功能作用 |
|---|---|---|---|
| NPM HTTP 服务 | 80 | 80 | 处理全站明文 Web 访问及 Let's Encrypt HTTP-01 挑战(自动强制跳转 HTTPS) |
| NPM HTTPS 服务 | 443 | 443 | 处理全站加密流量、HTTP/2 及 SNI 多域名路由分发 |
| NPM 管理控制台 | 81 | 81 (建议配合防火墙仅限特定 IP 访问) | 可视化管理 Web 界面,管理 Hosts、SSL 证书与访问控制列表 |
| MariaDB 数据库 | 3306 | 无须映射公网(仅 Docker 内网通信) | 持久化存储所有域名规则、访问日志与用户凭据 |
三、生产级部署:Docker Compose 一键启动
推荐采用独立数据库(MariaDB)架构方案,相较于默认的 SQLite 具备更高的读写并发与稳定性。
1. 创建项目目录与编排文件
mkdir -p ~/npm && cd ~/npm
nano docker-compose.yml
2. 编写 docker-compose.yml 配置
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm-app
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm_secure_password"
DB_MYSQL_NAME: "npm"
depends_on:
- db
db:
image: 'mariadb:10.11'
container_name: npm-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "npm_root_secure_password"
MYSQL_DATABASE: "npm"
MYSQL_USER: "npm"
MYSQL_PASSWORD: "npm_secure_password"
volumes:
- ./mysql:/var/lib/mysql
3. 启动容器与初始登录
docker compose up -d
docker compose ps
在浏览器中访问 http://你的服务器IP:81。初始默认凭据为:
- Email:
[email protected] - Password:
changeme
初次登录后,系统会强制要求你修改邮箱并设置全新的高强度强密码,务必立即更新。
四、自动化申请与维护泛域名 SSL 证书
推荐通过 Cloudflare DNS Challenge 模式一次性申请主域名及其所有二级子域名的泛域名通配证书(如 seedloc.com 与 *.seedloc.com),无需暴露任何验证端口,永不续期失败!
1. 获取 Cloudflare API Token
- 登录 Cloudflare 控制台,进入 My Profile -> API Tokens;
- 点击 Create Token,选择 Edit zone DNS 模板;
- 在 Zone Resources 中选择包含你域名的区域,创建并保存生成的 Token 字符串。
2. 在 NPM 中一键签发证书
- 在 NPM 后台导航栏点击 SSL Certificates -> Add SSL Certificate -> Let's Encrypt;
- 在 Domain Names 中填入两行:
你的域名.com和*.你的域名.com; - 勾选 Use a DNS Challenge,在 DNS Provider 下拉框中选择 Cloudflare;
- 将下方的配置文本中的
dns_cloudflare_api_token = ...替换为刚才创建的真实 Token; - 勾选同意 Let's Encrypt 协议,点击 Save。
NPM 会在后台自动调用 Certbot 通过 DNS TXT 记录完成身份验证。通常在 30 秒内即可顺利获得一张有效期为 90 天且完全自动提前续签的顶级泛域名证书!
五、配置 Proxy Host 反向代理服务
当本地部署了一个新的 Docker 容器服务(例如本地运行在 8080 端口的 WebUI),如何通过专属域名发布?
- 进入 Hosts -> Proxy Hosts -> Add Proxy Host;
- Details(基础信息):
- Domain Names:输入子域名(如
ai.你的域名.com); - Scheme:选择
http; - Forward Hostname / IP:若同在一台服务器内,填入
127.0.0.1或宿主机内网 IP; - Forward Port:填入服务的实际端口(如
8080); - 勾选 Block Common Exploits(拦截常见注入攻击)与 Websockets Support(关键:如果服务使用 WebSocket 必须勾选)。
- Domain Names:输入子域名(如
- SSL 选项卡:
- 在 SSL Certificate 下拉框中选中刚才申请的泛域名证书;
- 勾选 Force SSL(强制所有 HTTP 301 重定向至 HTTPS);
- 勾选 HTTP/2 Support 与 HSTS Enabled,提升传输性能与安全性。
- 点击 Save 保存,配置即时生效!
六、安全防护:配置 Access List 访问控制列表
如果某些管理后台不想被全网扫描器发现,可以通过 NPM 独有的 Access Lists 功能实施白名单过滤:
- 进入 Access Lists -> Add Access List,命名为
Company-Office-Only; - 在 Access 选项卡中,设置默认行为为拒绝,并在下方添加你的常用家庭/公司公网 IP(例如
123.45.67.89/32)允许访问; - 亦可在 Authorization 选项卡中添加专属的用户名和强密码(HTTP Basic Auth);
- 回到刚才创建的 Proxy Host 中,在 Access List 下拉框中关联该规则。
配置后,任何非白名单 IP 尝试访问该二级域名时,将直接在最外层被 NPM 返回 403 Forbidden,根本没有机会接触到你内部的真实服务!
七、总结与相关实践推荐
Nginx Proxy Manager 以极简的可视化交互消除了手写 Nginx 配置的繁重心智负担,配合泛域名 DNS 自动续签与 Access 白名单,是个人站长与 DevOps 团队管理多业务代理的不二利器。
更多现代私网组网、端口保护与面板运维指南:
• Linux VPS 生产级安全加固实操:禁用 Root、ED25519 密钥与 Fail2ban 防爆破
• Tailscale + Headscale 私有组网实战:零公网 IP 打通全平台局域网互联
• Cloudflare Tunnel 内网穿透实战:免公网 IP、免端口映射安全发布 NAS/本地服务
• Docker 搭建 RustDesk 自建远程桌面中继服务器:告别向日葵/ToDesk 限速
评论