反向代理的几种姿势对比
Homelab 里服务一多,端口号就记不住了——是时候认真搞一下反向代理。
把三种主流方案都跑了一遍,记录一下实际感受。
方案一:Nginx 手写配置
最经典的路子。装好 Nginx,往 /etc/nginx/conf.d/ 里丢配置文件:
1 | |
每加一个服务,复制一份改改 server_name 和 proxy_pass,然后 nginx -t && nginx -s reload。
优点:完全可控,性能最好,排查问题时日志清晰。WebSocket、缓存、限流这些高级玩法都能精确调。
缺点:SSL 证书要自己管。Let’s Encrypt + certbot 能自动续期,但初始配置有一堆坑,尤其是内网环境下用 DNS challenge 的时候。服务一多,配置文件膨胀得很快,虽然可以用模板或脚本生成,但终究是多了一层维护成本。
适合对 Nginx 配置熟悉、服务数量不算太多、或者有特殊需求的场景。
方案二:Nginx Proxy Manager (NPM)
Docker 一拉就起:
1 | |
打开 :81 的 Web 界面,点几下就能添加一条代理规则,SSL 证书申请和续期全自动。
优点:上手极快,GUI 操作对不想碰配置文件的人很友好。Access List 可以做简单的认证,Custom Nginx Configuration 也留了口子给高级用户。
缺点:底层还是 Nginx,但你没法完全控制生成的配置。遇到 WebSocket 升级、自定义 header 等需求时,得往 Advanced 选项卡里手写片段,体验割裂。另外它的数据库是 SQLite,备份迁移时要连着数据库一起搬。
实际用下来,管 10-20 个服务完全够用,是 Homelab 里最常见的选择。
方案三:Caddy
Caddy 的配置文件叫 Caddyfile,画风完全不同:
1 | |
就这么几行。Caddy 默认自动申请和续期 HTTPS 证书,不需要额外配置 certbot。对于有公网域名的场景,装好即用。
优点:配置极简,HTTPS 零配置,性能够用。单二进制文件部署,没有额外依赖。
缺点:生态和社区比 Nginx 小很多,遇到冷门需求时文档和搜索结果明显少一截。内网纯局域网场景下,自动 HTTPS 的优势发挥不出来,反而要额外配置内部 CA 或关闭自动 HTTPS。
怎么选
| 维度 | Nginx 手写 | NPM | Caddy |
|---|---|---|---|
| 上手难度 | 高 | 低 | 中 |
| 配置灵活度 | 最高 | 中 | 高 |
| SSL 管理 | 手动/certbot | 自动 | 自动 |
| 维护成本 | 中 | 低 | 低 |
| 适合服务数 | 不限 | 10-30 | 不限 |
一种可行的搭配:对外服务用 Caddy(自动 HTTPS 省心),内网服务用 NPM(GUI 操作快)。两套并行跑,各管各的。
另外 Traefik 配合 Docker label 自动发现服务的玩法也值得关注——容器一起来代理规则就自动生效,连手动添加这一步都省了。