把 Nginx 换成 Caddy 之后
动机说出来有点丢人:certbot 的自动续期不知道什么时候悄悄失效了, 证书过期两天我才发现,浏览器一片红。修好之后我想,与其每三个月提心吊胆一次, 不如换个把证书这件事彻底接管掉的东西。于是把小鸡上的 Nginx 换成了 Caddy。
配置文件短到不习惯
我原来的 nginx.conf 加上 certbot 塞进去的那些 ssl 指令,一个站点大概 60 行。 换成 Caddyfile 之后是这样:
blog.example.com {
root * /var/www/blog
file_server
encode zstd gzip
handle_path /api/* {
reverse_proxy 127.0.0.1:3000
}
}
就这些。没有 listen 443、没有 ssl_certificate 两行路径、没有一大坨 ssl_protocols 和 ssl_ciphers,也不需要单独写一个 80 端口的 server 块做跳转 ——HTTP 到 HTTPS 的 301 是默认行为。我三个站点的配置全部加起来 40 行不到, 原来光一个站就不止这个数。
证书这件事从此消失了
这是我换 Caddy 想要的东西,它也确实给到了:写上域名,起服务,证书自动申请、自动续期, 连 crontab 都不用碰。换掉之后的两个多月里我没有为证书做过任何一件事, 甚至没有「检查一下证书还有多久过期」这个动作——因为知道不需要。 这种省心是心智负担层面的,比省下的那几行配置值钱得多。
但也不是处处顺手
复杂 rewrite 不如 Nginx 灵活。我有一批旧 URL 要按规则 301 到新路径,
在 Nginx 里几条正则 rewrite 就完了;Caddy 里要用 uri replace、
redir 配合 matcher 拼出来,正则捕获组的写法也不一样,
其中一条带查询参数的规则我拼了半个晚上。能做到,但明显不是它顺手的方向。
社区积累少。Nginx 随便什么报错,搜出来前三条就有答案,十几年的存量在那里。 Caddy 搜中文资料基本没有,英文也常常只能翻到官方论坛里一两个帖子, 还得自己判断说的是不是 v2。遇到冷门问题,基本靠读官方文档硬啃。
reload 行为和 Nginx 不一样。我习惯了 nginx -t 先测配置再 reload,
Caddy 的 caddy reload 是把配置推给运行中的进程,配置错了会直接报错退回,
倒是不会把服务搞挂,但报错信息指到的位置有时候挺含糊,不如 nginx -t 那样直给行号来得踏实。
日志默认是 JSON。以前 tail -f 一眼扫过去就行,现在满屏大括号,
肉眼根本没法看,得管道给 jq。对程序处理来说 JSON 当然更好,
但半夜排查问题的时候,我还是怀念一行一条的 access log。
换不换
我的结论:像我这种个人小站——静态文件加一两个反代,换,别犹豫, 省下的证书心智负担远大于迁移成本,迁移本身也就一个晚上的事。 但如果你有一堆正则 rewrite、限流、复杂的 upstream 策略, 或者团队里所有人都只熟 Nginx,那就留在 Nginx,它依然是反代场景里更强的那个。 工具没有高下,看你的场景配不配。