运维知识
悠悠
2025年10月30日

告别命令行配置地狱!这个可视化反向代理神器让运维工作轻松10倍

最近在公司搭建测试环境的时候,又遇到了老问题——需要给十几个不同的服务配置反向代理。按照以前的做法,就是在nginx配置文件里一个个写server块,改完还得测试语法,重载服务...光是想想就头疼。

正好前段时间在GitHub上看到了Nginx Proxy Manager这个项目,说是可以通过Web界面管理nginx反向代理配置。我想着反正也要重新搭环境,不如试试这个工具到底好不好用。

用了一段时间后,我只能说——真香!今天就来跟大家分享一下这个让我彻底告别nginx配置文件的神器。

什么是Nginx Proxy Manager

官网地址:https://nginxproxymanager.com/

简单来说,Nginx Proxy Manager就是给nginx套了个漂亮的Web管理界面。你不用再去编辑那些复杂的配置文件,所有的反向代理、SSL证书、访问控制都可以在浏览器里点点鼠标就搞定。

这个项目是基于nginx的,但是把所有复杂的配置都封装起来了。你只需要在Web界面里填写源地址、目标地址,它就会自动生成对应的nginx配置。而且还支持自动申请Let's Encrypt证书,这个功能真的太实用了。

我记得以前每次配置SSL证书都要折腾半天,现在点几下鼠标就能搞定,效率提升不是一点半点。

在Debian 13上安装部署

我这次用的是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-compose

image-20251030225537816

安装完成后记得把当前用户加到docker组里,这样就不用每次都sudo了:

sudo usermod -aG docker $USER

这里需要重新登录一下才能生效。

image-20251030225717605

创建Docker Compose配置

我在/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 ps

image-20251030230959564

如果看到容器都是Up状态就说明启动成功了。

初始配置和基本使用

服务启动后,打开浏览器访问 http://你的服务器IP:81 就能看到登录界面了。

默认的管理员账号是:

第一次登录会强制要求修改邮箱和密码,这个安全措施还是很贴心的。

image-20251030231112812

界面介绍

登录后的界面还是很清爽的,主要分为几个部分:

  • Dashboard:总览页面,能看到所有代理主机的状态
  • Proxy Hosts:反向代理配置
  • Redirection Hosts:重定向配置
  • Streams:TCP/UDP流代理
  • 404 Hosts:404页面配置
  • Access Lists:访问控制列表
  • SSL Certificates:SSL证书管理

最常用的就是Proxy Hosts这个功能了。

image-20251030231135811

创建第一个反向代理

我先拿公司的一个内部系统来测试。这个系统跑在8080端口,我想通过域名访问,并且自动配置HTTPS。

点击"Proxy Hosts",然后点"Add Proxy Host",会弹出配置窗口:

Details标签页:

  • Domain Names:填写你的域名,比如 app.example.com
  • Scheme:选择http或https,这里是指后端服务的协议
  • Forward Hostname/IP:后端服务的地址,可以是IP或域名
  • Forward Port:后端服务端口
  • Cache Assets:是否缓存静态资源
  • Block Common Exploits:是否阻止常见攻击
  • Websockets Support:是否支持WebSocket

image-20251030231229419

image-20251030231344388

SSL标签页:

  • SSL Certificate:可以选择已有证书或者申请新的Let's Encrypt证书
  • Force SSL:强制HTTPS
  • HTTP/2 Support:启用HTTP/2
  • HSTS Enabled:启用HSTS安全头

我这里选择了"Request a new SSL Certificate",填写邮箱地址,勾选同意条款,点击保存。

等了大概30秒,证书就自动申请好了!这个速度比我手动用certbot快多了。

image-20251030231412383

实际使用场景和技巧

多环境管理

我们公司有开发、测试、预发布几个环境,每个环境都有十几个微服务。以前都是在nginx配置文件里写一大堆server块,维护起来特别麻烦。

现在用Nginx Proxy Manager,每个服务就是一个Proxy Host,需要修改的时候直接在界面上改就行了。而且还能很直观地看到每个服务的状态,哪个服务挂了一眼就能看出来。

SSL证书管理

这个功能真的是解决了我的一个大痛点。以前管理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配置的对比

用了这么长时间,我觉得Nginx Proxy Manager相比传统的nginx配置有明显的优势。

优势:

  1. 可视化管理,不需要记忆复杂的nginx语法
  2. 自动SSL证书申请和续期,省心省力
  3. 配置修改实时生效,不需要手动reload
  4. 内置访问控制和安全防护
  5. 支持配置备份和恢复

劣势:

  1. 灵活性相对较低,一些复杂的nginx配置可能无法实现
  2. 多了一层抽象,出问题时排查可能更复杂
  3. 资源占用相对较高(因为包含了数据库和Web界面)

总的来说,对于大部分常见的反向代理需求,Nginx Proxy Manager都能很好地满足。只有在一些特别复杂的场景下,可能还是需要直接配置nginx。

安全注意事项

虽然Nginx Proxy Manager简化了配置,但安全方面还是不能马虎。

管理界面安全

管理界面默认在81端口,建议:

  1. 修改默认端口,避免被扫描到
  2. 设置复杂的管理员密码
  3. 如果可能,只允许内网访问管理界面
  4. 定期备份配置数据

SSL配置

虽然可以自动申请证书,但还是要注意:

  1. 启用HSTS,防止降级攻击
  2. 禁用不安全的SSL协议版本

    1. 定期检查证书状态,虽然会自动续期但偶尔也会失败
    2. 对于敏感应用,考虑使用EV证书而不是DV证书

    访问控制

    合理使用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集成

    如果你用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]

    API自动化

    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集成

    虽然Kubernetes有自己的Ingress Controller,但在一些混合环境中,Nginx Proxy Manager也能发挥作用。

    我在一个项目中就是用Nginx Proxy Manager作为外部负载均衡器,将流量分发到不同的Kubernetes集群。

    未来发展和替代方案

    Nginx Proxy Manager虽然好用,但也不是万能的。在一些场景下可能需要考虑其他方案。

    替代方案

    Traefik: 更适合容器化环境,支持自动服务发现
    HAProxy: 性能更好,但配置相对复杂
    Cloudflare Tunnel: 适合需要穿透NAT的场景
    Kong: 功能更强大的API网关

    选择建议

    • 如果主要是简单的HTTP反向代理,Nginx Proxy Manager是很好的选择
    • 如果需要复杂的负载均衡算法,考虑HAProxy
    • 如果是微服务架构,Traefik可能更合适
    • 如果需要API管理功能,Kong是不错的选择

    我觉得工具没有绝对的好坏,关键是要适合自己的使用场景。

    写在最后

    Nginx Proxy Manager整体感受还是很不错的。特别是对于中小型团队来说,能够显著提升运维效率。

    最大的优点就是简单易用,基本上不需要学习成本,会用浏览器就能配置反向代理。自动SSL证书申请这个功能真的是太实用了,再也不用担心证书过期的问题。

    当然也有一些不足,比如在一些复杂场景下灵活性不够,但对于大部分常见需求都能很好地满足。

    如果你也在为nginx配置文件头疼,不妨试试这个工具。相信我,用过之后你就回不去了。

    最后提醒一下,虽然工具简化了操作,但安全意识不能放松。该做的备份、监控、访问控制一样都不能少。

    好了,今天的分享就到这里。如果你在使用过程中遇到什么问题,欢迎在评论区交流讨论。觉得这篇文章对你有帮助的话,别忘了点赞转发支持一下!


    如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!

    公众号:运维躬行录

    个人博客:躬行笔记

文章目录

博主介绍

热爱技术的云计算运维工程师,Python全栈工程师,分享开发经验与生活感悟。
欢迎关注我的微信公众号@运维躬行录,领取海量学习资料

微信二维码