当你自部署的服务越来越多,迟早会遇到两个需求:一是想把 http://服务器IP:端口 变成好记的域名,二是想把 HTTPS 证书自动化。
Nginx Proxy Manager(通常简称 NPM)就是为这个场景准备的。它把传统上要手写的 Nginx 反向代理配置做成了后台界面,适合不想长期维护 Nginx 配置文件的人。
为什么很多人先装它
它最实用的地方不是“功能特别多”,而是把高频工作收敛成了几个按钮:
添加代理主机、申请 Let’s Encrypt 证书、强制跳转 HTTPS、配置访问列表。
对于个人服务器、小团队工具站、家庭实验室,这套能力已经覆盖了大部分需求。
如果你已经有 Open WebUI、Uptime Kuma、博客、下载器之类的多个服务,NPM 往往会成为对外入口。
compose 示例
这份 compose 很常见,也足够实用:
services:
app:
image: "jc21/nginx-proxy-manager:latest"
container_name: npm-app
restart: unless-stopped
environment:
TZ: "Asia/Shanghai"
ports:
- "80:80"
- "81:81"
- "443:443"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
81 端口是后台管理界面,80 和 443 则负责实际对外访问。./letsencrypt 一定要持久化,否则证书重建和续期记录会丢。
部署命令
先准备目录,再启动容器:
mkdir -p ~/apps/nginx-proxy-manager
cd ~/apps/nginx-proxy-manager
mkdir -p data letsencrypt
docker compose up -d
启动后,浏览器访问 http://服务器IP:81 进入后台。第一次登录时按官方默认账户登录,然后立刻修改邮箱和密码。这个步骤不要拖,因为反向代理入口通常是整台机器最重要的边界之一。
实际使用顺序
比较稳妥的顺序是:
- 先确保域名已经解析到你的服务器公网 IP。
- 再在 NPM 里新增 Proxy Host,填入域名和目标内网地址。
- 最后勾选 SSL 证书申请与强制 HTTPS。
这样做的好处是,一旦证书申请失败,你更容易判断问题出在 DNS、端口放行,还是目标服务本身没启动。
适合做什么,不适合做什么
NPM 很适合大多数自部署入口场景,但它不是万能网关。
如果你要做非常复杂的四层转发、WAF、服务网格或者大规模企业级规则,最终还是要回到更专业的方案。
但对个人和小团队来说,它的“够用且省事”恰恰是最大优点。
我的建议是:只要你的服务数量超过两个,就该把访问入口收敛到统一代理层。这样以后迁移端口、加证书、换后端服务时,用户侧域名都不用变。