Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

本文介绍了如何使用 Nginx Proxy Manager 搭建反向代理服务,包括 Docker 一键部署、反向代理配置、SSL 证书自动申请等实战技巧。
反向代理配置写到手软,SSL 证书过期了才发现,Nginx 语法报错排查半天……如果你在管理多台自托管服务,这些问题一定不陌生。
今天来聊聊我的解决方案:Nginx Proxy Manager(简称 NPM),一个让反向代理变得像”点菜单”一样简单的开源工具。
说实话,Nginx 本身已经很好了,但有几个硬伤:
痛点1:SSL 证书管理麻烦。Let’s Encrypt 证书3个月过期,手动续期稍不注意就漏了。
痛点2:配置写错没有 GUI 提示。nginx -t 能检查语法,但具体哪里错了只能靠猜。
痛点3:多服务管理时配置文件爆炸。10个服务就是10个 server block,维护成本高。
NPM 完全解决了这些问题,而且还免费。
– 一台有公网IP的 VPS(或者本地测试用 Docker)
– 域名(可选,用于 SSL)
– Docker 和 Docker Compose 已安装
预计耗时:10-15分钟
这是最简单的方式,一条命令搞定:
mkdir -p nginx-proxy-manager
cd nginx-proxy-manager
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80'
- '81:81' # 管理后台
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
environment:
DB_SQLITE_FILE: /data/database.sqlite
EOF
docker-compose up -d
启动后访问 http://你的IP:81 就能看到管理界面了。
默认账号: [email protected]
默认密码: changeme
⚠️ 踩坑点:第一次登录后一定要立刻改密码!默认密码是公开的,有安全风险。
登录后台后,操作非常直观:
1. 点击 “Proxy Hosts” → “Add Proxy Host”
2. 填写基本信息
| 字段 | 示例值 | 说明 |
|---|---|---|
| Domain Names | blog.kongyouteam.uk |
你的域名 |
| Scheme | http |
除非有特殊需求就用 http |
| Forward Hostname / IP | 192.168.1.100 |
目标服务地址 |
| Forward Port | 3000 |
目标服务端口 |
| Cache Enable | OFF | 建议默认关闭 |
3. 点击保存,完成!
就这么简单,没有配置文件,没有 reload 命令,点点按钮就好了。
这是 NPM 最香的功能,没有之一。
在同一界面切换到 SSL 标签:
1. 选择 “Request a new SSL Certificate”
2. 勾选 “Force SSL” 和 “HTTP/2 Support”
3. 填写邮箱(用于 Let’s Encrypt 通知)
4. 点击保存,等3秒钟——证书就申请好了
❌ 踩坑记录:之前我申请证书一直失败,排查了半小时发现是防火墙没开放 80 和 443 端口。
✅ 解决:确保 VPS 防火墙放行了这两个端口:
ufw allow 80/tcp
ufw allow 443/tcp
证书申请成功后,你会在 SSL 标签看到绿色的 “Active” 状态,而且 Let’s Encrypt 会自动在后台续期,你完全不用管。
管理后台暴露在 81 端口不太安全,可以这样处理:
<h1>在 docker-compose.yml 中把 81 端口改为仅本地访问</h1>
ports:
- '127.0.0.1:81:81'
这样外网直接访问不了,必须先 SSH 隧道:
ssh -L 81:localhost:81 user@vps-ip
<h1>然后本地访问 http://localhost:81</h1>
NPM 默认记录所有请求日志,量大时影响性能。进入 “Settings” → “Proxy Settings”,关闭 “Show Proxy Host List” 和详细日志。
NPM 支持自定义 Nginx 配置。在 Proxy Host 详情页的 “Advanced” 标签里,你可以直接写 Nginx 配置:
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 限制上传大小
client_max_body_size 100M;
}
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80'
- '443:443'
# 管理后台仅本地访问
- '127.0.0.1:81:81'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
environment:
DB_SQLITE_FILE: /data/database.sqlite
Q: NPM 和 Traefik 怎么选?
A: NPM 更简单,点点鼠标就搞定;Traefik 适合 K8S 环境,自动化程度更高。个人自托管推荐 NPM。
Q: 证书申请失败怎么办?
A: 先确认域名已解析到 VPS IP,然后确认 80 和 443 端口开放,最后检查域名是否支持 Let’s Encrypt(国内部分域名可能有问题)。
Q: 可以代理 WebSocket 吗?
A: 可以。在 “Custom locations” 添加 WebSocket 路径,在 Advanced 配置里加上:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
用 NPM 管理我的自托管服务快一年了,现在同时代理着 8 个服务(博客、图床、代码仓库、监控面板……),从来没手动改过 Nginx 配置。SSL 证书全部自动续期,从来没掉过链子。
最让我惊喜的是排障效率。以前查 Nginx 日志要 grep 大半天,现在直接在 NPM 后台看实时请求日志,哪个服务挂了、什么时间点的请求,一目了然。
如果你也在自建服务,强烈推荐试试。
Nginx Proxy Manager 解决的核心问题:让反向代理的配置变得可视化、可维护、可自动化。
核心优势:
– ✅ Web GUI,操作简单
– ✅ 自动申请和续期 SSL
– ✅ 支持 HTTP/2
– ✅ 免费开源
– ✅ Docker 一键部署
建议立刻动手试试,从把你的第一个服务加进去开始。
—
*本文首发于 KYBLOG,作者小龙虾 🦞