
最近在公司搭建测试环境的时候,又遇到了老问题——需要给十几个不同的服务配置反向代理。按照以前的做法,就是在nginx配置文件里一个个写server块,改完还得测试语法,重载服务...光是想想就头疼。
正好前段时间在GitHub上看到了Nginx Proxy Manager这个项目,说是可以通过Web界面管理nginx反向代理配置。我想着反正也要重新搭环境,不如试试这个工具到底好不好用。
用了一段时间后,我只能说——真香!今天就来跟大家分享一下这个让我彻底告别nginx配置文件的神器。
官网地址:https://nginxproxymanager.com/
简单来说,Nginx Proxy Manager就是给nginx套了个漂亮的Web管理界面。你不用再去编辑那些复杂的配置文件,所有的反向代理、SSL证书、访问控制都可以在浏览器里点点鼠标就搞定。
这个项目是基于nginx的,但是把所有复杂的配置都封装起来了。你只需要在Web界面里填写源地址、目标地址,它就会自动生成对应的nginx配置。而且还支持自动申请Let's Encrypt证书,这个功能真的太实用了。
我记得以前每次配置SSL证书都要折腾半天,现在点几下鼠标就能搞定,效率提升不是一点半点。
我这次用的是Debian 13系统,整个安装过程还算顺利。不过中间也踩了几个坑,一会儿会详细说。
首先确保系统是最新的:
sudo apt update && sudo apt upgrade -y然后安装Docker和Docker Compose,因为Nginx Proxy Manager官方推荐用Docker部署:
# 安装必要的包
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加Docker仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y
# 安装Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-composeimage-20251030225537816
安装完成后记得把当前用户加到docker组里,这样就不用每次都sudo了:
sudo usermod -aG docker $USER这里需要重新登录一下才能生效。
image-20251030225717605
我在/opt目录下创建了一个专门的文件夹来存放配置:
sudo mkdir -p /opt/nginx-proxy-manager
cd /opt/nginx-proxy-manager然后创建docker-compose.yml文件:
cat <<eof>docker-compose.yml
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
eof这个配置文件里有几个要注意的地方。端口81是管理界面的端口,80和443是实际提供服务的端口。数据库我用的是MariaDB,密码什么的在生产环境记得改成复杂一点的。
配置文件准备好后就可以启动了:
sudo docker-compose up -d
image-20251030225826668
第一次启动会下载镜像,可能需要等一会儿。启动完成后可以检查一下容器状态:
sudo docker-compose psimage-20251030230959564
如果看到容器都是Up状态就说明启动成功了。
服务启动后,打开浏览器访问 http://你的服务器IP:81 就能看到登录界面了。
默认的管理员账号是:
第一次登录会强制要求修改邮箱和密码,这个安全措施还是很贴心的。
image-20251030231112812
登录后的界面还是很清爽的,主要分为几个部分:
最常用的就是Proxy Hosts这个功能了。
image-20251030231135811
我先拿公司的一个内部系统来测试。这个系统跑在8080端口,我想通过域名访问,并且自动配置HTTPS。
点击"Proxy Hosts",然后点"Add Proxy Host",会弹出配置窗口:
Details标签页:
image-20251030231229419image-20251030231344388
SSL标签页:
我这里选择了"Request a new SSL Certificate",填写邮箱地址,勾选同意条款,点击保存。
等了大概30秒,证书就自动申请好了!这个速度比我手动用certbot快多了。

image-20251030231412383
我们公司有开发、测试、预发布几个环境,每个环境都有十几个微服务。以前都是在nginx配置文件里写一大堆server块,维护起来特别麻烦。
现在用Nginx Proxy Manager,每个服务就是一个Proxy Host,需要修改的时候直接在界面上改就行了。而且还能很直观地看到每个服务的状态,哪个服务挂了一眼就能看出来。
这个功能真的是解决了我的一个大痛点。以前管理SSL证书要记住每个证书的过期时间,定期手动续期。现在Let's Encrypt证书会自动续期,再也不用担心证书过期导致服务不可用了。
而且支持通配符证书,一个*.example.com的证书就能覆盖所有子域名。
Access Lists功能可以设置IP白名单或黑名单,对于一些内部系统的访问控制很有用。
我给测试环境设置了IP白名单,只允许公司内网访问。配置也很简单,创建一个Access List,添加允许的IP段,然后在Proxy Host里关联就行了。
除了HTTP代理,还支持TCP和UDP的流量代理。我用这个功能代理了MySQL和Redis的连接,效果还不错。
不过这个功能相对简单一些,没有HTTP代理那么多高级选项。
使用过程中也遇到了一些问题,记录一下避免大家重复踩坑。
刚开始部署的时候,发现80端口启动失败。检查后发现系统里已经有apache在跑了。
解决方法就是先停掉apache:
sudo systemctl stop apache2
sudo systemctl disable apache2或者修改docker-compose.yml里的端口映射,比如改成8080:80。
有几次Let's Encrypt证书申请失败,错误信息显示域名验证不通过。
这个问题通常是DNS解析的问题。Let's Encrypt需要通过HTTP-01或DNS-01方式验证域名所有权,如果域名还没有解析到服务器IP,验证就会失败。
解决方法是先确保域名正确解析,然后再申请证书。
用了这么长时间,我觉得Nginx Proxy Manager相比传统的nginx配置有明显的优势。
优势:
劣势:
总的来说,对于大部分常见的反向代理需求,Nginx Proxy Manager都能很好地满足。只有在一些特别复杂的场景下,可能还是需要直接配置nginx。
虽然Nginx Proxy Manager简化了配置,但安全方面还是不能马虎。
管理界面默认在81端口,建议:
虽然可以自动申请证书,但还是要注意:
1. 启用HSTS,防止降级攻击
2. 禁用不安全的SSL协议版本
合理使用Access Lists功能:
# 可以在Advanced配置中添加更细粒度的控制
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;我在生产环境中给管理后台都加了IP白名单,只允许办公网络访问。
Nginx Proxy Manager的日志可以通过docker logs查看:
sudo docker-compose logs -f app建议配置日志轮转,避免日志文件过大:
# 在docker-compose.yml中添加日志配置
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"Nginx Proxy Manager还可以和其他工具集成,实现更强大的功能。
如果你用Docker Swarm管理容器集群,可以配置Nginx Proxy Manager自动发现新的服务:
version: '3.8'
services:
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
ports:
- "80:80"
- "443:443"
- "81:81"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
deploy:
placement:
constraints: [node.role == manager]Nginx Proxy Manager提供了REST API,可以通过脚本自动化管理:
# 获取访问token
TOKEN=$(curl -s -X POST http://localhost:81/api/tokens \
-H "Content-Type: application/json" \
-d '{"identity": "admin@example.com", "password": "your_password"}' | jq -r '.token')
# 创建新的代理主机
curl -X POST http://localhost:81/api/nginx/proxy-hosts \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"domain_names": ["api.example.com"],
"forward_host": "192.168.1.100",
"forward_port": 8080,
"forward_scheme": "http",
"certificate_id": 1,
"ssl_forced": true
}'这个功能在CI/CD流程中特别有用,可以在部署新服务时自动配置反向代理。
虽然Kubernetes有自己的Ingress Controller,但在一些混合环境中,Nginx Proxy Manager也能发挥作用。
我在一个项目中就是用Nginx Proxy Manager作为外部负载均衡器,将流量分发到不同的Kubernetes集群。
Nginx Proxy Manager虽然好用,但也不是万能的。在一些场景下可能需要考虑其他方案。
Traefik: 更适合容器化环境,支持自动服务发现 HAProxy: 性能更好,但配置相对复杂 Cloudflare Tunnel: 适合需要穿透NAT的场景 Kong: 功能更强大的API网关
我觉得工具没有绝对的好坏,关键是要适合自己的使用场景。
Nginx Proxy Manager整体感受还是很不错的。特别是对于中小型团队来说,能够显著提升运维效率。
最大的优点就是简单易用,基本上不需要学习成本,会用浏览器就能配置反向代理。自动SSL证书申请这个功能真的是太实用了,再也不用担心证书过期的问题。
当然也有一些不足,比如在一些复杂场景下灵活性不够,但对于大部分常见需求都能很好地满足。
如果你也在为nginx配置文件头疼,不妨试试这个工具。相信我,用过之后你就回不去了。
最后提醒一下,虽然工具简化了操作,但安全意识不能放松。该做的备份、监控、访问控制一样都不能少