青色渐变上三条错位的圆角横条,像一条代理链

Nginx 和 Caddy,到底该用哪个

反向代理这件事,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 没有对等物。

一张对比表

NginxCaddy
配置长度长,模板化极短
HTTPS要配 certbot默认自动
默认转发头要手写自动
学习曲线陡,但资料多平缓,但资料少
细粒度控制很强够用
出问题排查日志清晰需要熟悉它的日志
适合谁要精细控制、跟着教程走想省心、站点不多

我是怎么选的

站点少、机器小、没有专职运维,Caddy 的自动 HTTPS 直接省掉了一类事故。证书过期这种问题,不该靠人记得。

但有两个前提:

  1. DNS 必须先解析到这台机器。Caddy 申请证书时会去验证域名,解析没生效就会失败,而且失败信息不算直观。
  2. 改完要重启。我这边 Caddy 的 admin 接口是关的,caddy reload 不生效,只能 systemctl restart caddy——重启期间所有站点会闪断一两秒。

如果是公司项目、要接 WAF、要做复杂的路径重写和限流,我还是会选 Nginx。不是它更好,是它的资料和生态能救命。

一句话:个人站选 Caddy,省的是运维;复杂场景选 Nginx,买的是控制力。