反向代理这件事,Nginx 和 Caddy 都能干。区别不在能不能,而在你愿意为它写多少配置、记多少语法。
我这台 2 核 2G 的小机器上用的是 Caddy,但不是因为它更强——是因为我懒得每三个月想起来续一次证书。
先看同一个站点的两份配置
目标:把 example.com 反代到本机的 3000 端口,顺便把 HTTP 跳到 HTTPS。
Caddy:
example.com {
reverse_proxy 127.0.0.1:3000
}
三行。证书申请、续期、HTTP 到 HTTPS 的跳转,全在里面了。
Nginx:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
再加一个 certbot 定时任务。
两份配置都对,但心智负担完全不同:Nginx 要你知道每个 header 为什么加;Caddy 默认就帮你加了。
Caddy 省掉的那些事
- 证书全自动:首次访问时申请,之后自动续。不用记
certbot renew,也不用担心 90 天到期。 - 默认 HTTPS:写个域名就自动开 TLS,HTTP 自动 308 跳转,不用单独写一个 server 块。
- 默认转发头:
X-Forwarded-For、X-Forwarded-Proto这些不用手写。 - 配置即文档:Caddyfile 短到可以贴进备忘录。
代价是出问题时你不知道它在背后做了什么。证书签不下来,第一反应往往是“日志在哪”。
Nginx 强在哪
- 生态:几乎每篇教程、每个面板、每个容器镜像都默认 Nginx。遇到怪问题,搜到的答案大概率是 Nginx 的。
- 细粒度控制:限流、缓存、rewrite、gzip/brotli 的每个参数都能捏。Caddy 也能,但选项没那么多。
- 性能:静态文件和高并发场景,Nginx 仍然是标杆。不过对个人站来说,这点差距基本感觉不到——瓶颈通常在带宽,不在反代。
- 模块:Lua、nginx-mod-http-* 那一套,Caddy 没有对等物。
一张对比表
| Nginx | Caddy | |
|---|---|---|
| 配置长度 | 长,模板化 | 极短 |
| HTTPS | 要配 certbot | 默认自动 |
| 默认转发头 | 要手写 | 自动 |
| 学习曲线 | 陡,但资料多 | 平缓,但资料少 |
| 细粒度控制 | 很强 | 够用 |
| 出问题排查 | 日志清晰 | 需要熟悉它的日志 |
| 适合谁 | 要精细控制、跟着教程走 | 想省心、站点不多 |
我是怎么选的
站点少、机器小、没有专职运维,Caddy 的自动 HTTPS 直接省掉了一类事故。证书过期这种问题,不该靠人记得。
但有两个前提:
- DNS 必须先解析到这台机器。Caddy 申请证书时会去验证域名,解析没生效就会失败,而且失败信息不算直观。
- 改完要重启。我这边 Caddy 的 admin 接口是关的,
caddy reload不生效,只能systemctl restart caddy——重启期间所有站点会闪断一两秒。
如果是公司项目、要接 WAF、要做复杂的路径重写和限流,我还是会选 Nginx。不是它更好,是它的资料和生态能救命。
一句话:个人站选 Caddy,省的是运维;复杂场景选 Nginx,买的是控制力。
