反向代理的几种姿势对比

Homelab 里服务一多,端口号就记不住了——是时候认真搞一下反向代理。

把三种主流方案都跑了一遍,记录一下实际感受。

方案一:Nginx 手写配置

最经典的路子。装好 Nginx,往 /etc/nginx/conf.d/ 里丢配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name jellyfin.example.local;

location / {
proxy_pass http://127.0.0.1:8096;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

每加一个服务,复制一份改改 server_nameproxy_pass,然后 nginx -t && nginx -s reload

优点:完全可控,性能最好,排查问题时日志清晰。WebSocket、缓存、限流这些高级玩法都能精确调。

缺点:SSL 证书要自己管。Let’s Encrypt + certbot 能自动续期,但初始配置有一堆坑,尤其是内网环境下用 DNS challenge 的时候。服务一多,配置文件膨胀得很快,虽然可以用模板或脚本生成,但终究是多了一层维护成本。

适合对 Nginx 配置熟悉、服务数量不算太多、或者有特殊需求的场景。

方案二:Nginx Proxy Manager (NPM)

Docker 一拉就起:

1
2
3
4
5
6
7
8
9
10
services:
npm:
image: jc21/nginx-proxy-manager:latest
ports:
- "80:80"
- "443:443"
- "81:81"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt

打开 :81 的 Web 界面,点几下就能添加一条代理规则,SSL 证书申请和续期全自动。

优点:上手极快,GUI 操作对不想碰配置文件的人很友好。Access List 可以做简单的认证,Custom Nginx Configuration 也留了口子给高级用户。

缺点:底层还是 Nginx,但你没法完全控制生成的配置。遇到 WebSocket 升级、自定义 header 等需求时,得往 Advanced 选项卡里手写片段,体验割裂。另外它的数据库是 SQLite,备份迁移时要连着数据库一起搬。

实际用下来,管 10-20 个服务完全够用,是 Homelab 里最常见的选择。

方案三:Caddy

Caddy 的配置文件叫 Caddyfile,画风完全不同:

1
2
3
4
5
6
7
jellyfin.example.local {
reverse_proxy 127.0.0.1:8096
}

grafana.example.local {
reverse_proxy 127.0.0.1:3000
}

就这么几行。Caddy 默认自动申请和续期 HTTPS 证书,不需要额外配置 certbot。对于有公网域名的场景,装好即用。

优点:配置极简,HTTPS 零配置,性能够用。单二进制文件部署,没有额外依赖。

缺点:生态和社区比 Nginx 小很多,遇到冷门需求时文档和搜索结果明显少一截。内网纯局域网场景下,自动 HTTPS 的优势发挥不出来,反而要额外配置内部 CA 或关闭自动 HTTPS。

怎么选

维度 Nginx 手写 NPM Caddy
上手难度
配置灵活度 最高
SSL 管理 手动/certbot 自动 自动
维护成本
适合服务数 不限 10-30 不限

一种可行的搭配:对外服务用 Caddy(自动 HTTPS 省心),内网服务用 NPM(GUI 操作快)。两套并行跑,各管各的。

另外 Traefik 配合 Docker label 自动发现服务的玩法也值得关注——容器一起来代理规则就自动生效,连手动添加这一步都省了。


反向代理的几种姿势对比
https://ghost.kasumi.live/2026/03/03/反向代理的几种姿势对比/
作者
Amadeus
发布于
2026年3月3日
许可协议