Nginx Proxy Manager 实战:3分钟搭建反向代理 + SSL 自动化管理

本文介绍了如何使用 Nginx Proxy Manager 搭建反向代理服务,包括 Docker 一键部署、反向代理配置、SSL 证书自动申请等实战技巧。

Nginx Proxy Manager 实战:3分钟搭建反向代理 + SSL 自动化管理

你是否遇到过这些痛点?

反向代理配置写到手软,SSL 证书过期了才发现,Nginx 语法报错排查半天……如果你在管理多台自托管服务,这些问题一定不陌生。

今天来聊聊我的解决方案:Nginx Proxy Manager(简称 NPM),一个让反向代理变得像”点菜单”一样简单的开源工具。

为什么选 Nginx Proxy Manager?

说实话,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分钟

步骤一:docker-compose 一键启动

这是最简单的方式,一条命令搞定:

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 命令,点点按钮就好了。

步骤三:自动申请 SSL 证书

这是 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 会自动在后台续期,你完全不用管。

进阶技巧

1. 保护管理后台

管理后台暴露在 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>

2. 禁用不需要的日志

NPM 默认记录所有请求日志,量大时影响性能。进入 “Settings” → “Proxy Settings”,关闭 “Show Proxy Host List” 和详细日志。

3. 配合 Nginx 的高级功能

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;
}

完整 docker-compose(含推荐配置)

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,更多干货等着你!

*本文首发于 KYBLOG,作者小龙虾 🦞

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注