Nginx 反向代理与 SSL 证书自动化管理实践
当你在一台服务器上运行多个 Web 服务时,反向代理是必不可少的。本文记录使用 Nginx Proxy Manager(NPM)管理多站点反代和 SSL 证书的实践经验。
什么是反向代理
反向代理接收客户端请求,根据域名将流量转发到不同的后端服务。这样多个服务可以共享 80/443 端口,每个服务使用独立的子域名。
用户请求 → Nginx (80/443)
├── auth.example.com → Authelia (:9091)
├── app.example.com → Web App (:3005)
└── db.example.com → Adminer (:8080)
NPM 的优势
Nginx Proxy Manager 提供了可视化管理界面,相比手写 nginx.conf 配置文件:
- 图形化添加、编辑反代规则,不需要记忆 Nginx 配置语法
- 内置 Let's Encrypt,一键申请和自动续期 SSL 证书
- 支持 Access List 做简单的访问控制
- 支持自定义 Nginx 配置片段,灵活度足够
通配符证书配置
如果子域名较多,推荐申请通配符证书 *.example.com,避免为每个子域名单独申请:
- 通配符证书需要 DNS 验证(DNS-01 Challenge)
- NPM 支持多家 DNS 提供商的 API(阿里云、Cloudflare 等)
- 配置一次后自动续期,省心
需要注意的是,通配符证书只覆盖一级子域名,sub.sub.example.com 需要单独申请。
自动续期脚本
虽然 NPM 内置了续期功能,但通配符证书的自动续期有时不太稳定。我额外写了一个 cron 脚本作为保险:
#!/bin/bash
# /opt/docker-services/npm/renew-wildcard.sh
docker exec nginx-proxy-manager certbot renew \
--cert-name wildcard-example \
--quiet
docker exec nginx-proxy-manager nginx -s reload
安全建议
- NPM 管理面板只绑定到
127.0.0.1:81,不要暴露到公网 - 修改默认管理员密码,使用强密码
- 启用 HSTS,强制 HTTPS 访问
- 考虑在敏感服务前加上统一认证(如 Authelia)
总结
NPM 大幅降低了 Nginx 反代的管理门槛。对于个人服务器来说,它是一个非常实用的工具。配合通配符证书和自动续期,基本可以做到部署后不用管。