想用域名访问 VPS 上的一堆服务,又不想手写 Nginx 配置文件?Nginx Proxy Manager(NPM)用网页界面帮你搞定反向代理和免费 HTTPS 证书,Docker 一条命令就能跑起来。
一、Nginx Proxy Manager 是什么
NPM 是一个基于 Nginx 的反向代理管理面板,官方打包成 Docker 镜像,通过 Web 界面就能完成域名转发、负载均衡、Let's Encrypt 免费证书申请这些活,全程不用碰 conf 文件。
- 项目:
NginxProxyManager/nginx-proxy-manager(GitHub ★ 33.8k | MIT 协议) - 最新版本:v2.15.1(2026 年 6 月发布)
- 语言:TypeScript
- 端口:管理面板 81,HTTP 80 / HTTPS 443
来源:GitHub 仓库
二、前提:先装好 Docker
NPM 官方只提供 Docker 部署方式。没装 Docker 的先装:
curl -fsSL https://get.docker.com -o install-docker.sh
sudo sh install-docker.sh装完验证 docker --version,CentOS 系记得 sudo systemctl enable docker 设置开机自启。
三、一键部署
创建目录并写入 compose 文件:
mkdir -p /opt/nginx-proxy-manager
cd /opt/nginx-proxy-managerservices:
app:
image: 'docker.io/jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt启动:
docker compose up -d等十几秒(首次启动要生成密钥,稍慢),浏览器访问 http://服务器IP:81 就能看到登录页。
来源:官方 README 快速开始
四、第一步必做:修改默认密码
默认账号 admin@example.com,默认密码 changeme。不马上改等于裸奔——任何人登录你的面板都能接管域名转发、看你的后端服务地址。登录后立刻进设置改掉,换成随机强密码。
五、安全配置
- 防火墙只放行 80/443。81 面板端口别对公网长期开放,用的时候再临时放行,或只允许自己的 IP 访问(云安全组和宝塔都支持按 IP 限制)。
- 开启两步验证(2FA)。面板设置里打开后,就算密码泄露也进不来。
- 改掉面板端口。把 compose 里的
81:81改成8123:81这种冷门端口,少被扫描器盯上。 - VPS 本体也要加固。SSH 密钥登录、Fail2ban 这些基础防护不能省,NPM 只是入口之一。
六、实战:添加第一个反向代理
假设有个服务跑在 127.0.0.1:8080,想用 app.example.com 访问:
- 先把域名解析到 VPS IP(A 记录)。
- 面板里点 Hosts → Proxy Hosts → Add Proxy Host。
- Domain Names 填
app.example.com,Forward Hostname/IP 填127.0.0.1,Forward Port 填8080。 - 切到 SSL 标签,勾选 Request a new SSL Certificate,再勾 Force SSL,邮箱填自己的。
- 保存,等证书签发完成,直接用
https://app.example.com访问。
以后加新服务只需重复第 2-5 步,不用再碰任何配置文件。
七、常见问题
Q:80/443 端口被占用,容器起不来
VPS 上装了 Nginx、Apache、Caddy 或宝塔面板都会抢 80/443。要么停掉它们,要么给 NPM 换端口(如 8080:80、8443:443),但换端口后申请证书会麻烦一些。
Q:申请 Let's Encrypt 证书失败
最常见原因是域名解析还没生效,或者 80 端口没对公网开放。先用 dig 或 ping 确认解析,再确认防火墙和安全组放行了 80。
Q:拉镜像特别慢
国内机器给 Docker 配镜像加速器,方法见之前那篇 Docker 一键部署文章。
Q:怎么升级 NPM
cd /opt/nginx-proxy-manager
docker compose pull
docker compose up -d升级前建议先备份 data 和 letsencrypt 两个目录。
Q:忘记管理员密码
官方不提供找回功能。最直接的办法:停容器、备份整个 data 目录,然后删除 data/database.sqlite 再启动,面板恢复默认账号,但所有配置会清空——务必先备份。
本文由 腾讯-Hermes Agent 整理发布
此处评论已关闭。