很久之前就关注并使用Caddy来替代Nginx了,能够自动签Let's Encrypt证书实在是博客神器,然而商用收费实在有bu些neng遗bai憾piao。但去年官方公布了个好消息,Caddy更新了项目的许可协议,所有Caddy的二进制都可以免费使用了(之前是个人使用免费,商业使用收费),并且Caddy 2开始作为一个完全开源的项目运作,公司基于Caddy 2构建Enterprise商业版本。

作为一名不折腾会死星人,看到它都beta了17个版本了便手痒准备吃个螃蟹。于是我的博客就炸了

注意:Caddy 2的Caddyfile和旧版的Caddyfile不兼容!一定要记得备份之前的Caddyfile!

如果是用docker跑的,那么可以把之前的镜像换成caddy/caddy,它的构建脚本在https://github.com/caddyserver/caddy-docker,也有文档可供参考。

记得挂个volume,对/data/caddy这个目录进行持久化

然后便是改写Caddyfile了,我这个博客是Caddy反向代理到ghost,之前的配置文件是这样的

Caddy 1

https://farer.org https://www.farer.org * {
    gzip
    tls your_email@example.com
    proxy / ghost_blog_host:2368 {
          transparent
 }
}

然后我折腾了半天,修了一堆报错(比如指令不支持啊,证书签失败啊,无限重定向啊),终于折腾好了。

Caddy 2

farer.org, www.farer.org {
  encode gzip
  tls your_email@example.com
  reverse_proxy http://ghost_blog_host:2368 {
    header_up Host {http.reverse_proxy.upstream.hostport}
    header_up X-Real-IP {http.request.remote}
    header_up X-Forwarded-For {http.request.remote}
    header_up X-Forwarded-Port {http.request.port}
    header_up X-Forwarded-Proto {http.request.scheme}
  }
}

上面两个配置基本上是完全一致可以对应上的,像我一样用caddy和ghost的可以无脑复制粘贴,把域名啥的改改应该就能用了。

新版的caddy默认会开启https证书的签名,以及HTTP跳HTTPS的跳转,这个还挺方便的,就是配置文件变化比较大,想用的话得多看看官方文档,尽量避免一把梭。

然后你问为啥多了这么一坨东西?因为他们把transparent这么方便的指令给干掉了,不知道是怎么想的。而正好Ghost要读这些header以完成正确处理,没有就会爆炸。总之想通过反向代理正常提供服务,就得像Nginx一样,得把各种header带进去的配置配上。(简直就是方向错了=。=)

如果你遇到了证书签失败怎么办

在log里看到类似如下报错

[ERROR] acme: error: 429 :: POST :: https://acme-v02.api.letsencrypt.org/acme/new-order :: urn:ietf:params:acme:error:rateLimited :: Error creating new order :: too many certificates already issued for exact set of domains: www.farer.org: see https://letsencrypt.org/docs/rate-limits/, url:  (challenge=tls-alpn-01 remaining=[http-01])

这是因为letsencrypt的接口是有调用次数限制的,如果你在调试部署一直重启,就可能调多了不给你签了,得等它冷却。

那么怎么救呢?你升级前旧版caddy用的.caddy目录还有吧?挂到容器内/data/caddy下,这样它启动的时候会自动跑一次migration,并使用以前的证书,不会去申请签新的证书了,然后就可能应该能救活了=。=

最后再次提醒 /data/caddy 这个目录是需要持久化的,不然每次重新起容器都要去签证书。


升到Caddy 2了之后还可以看看文档,开个experimental_http3什么的玩玩。就这样,炸了一次博客,又修了一次博客,还能水一篇出来,计画通。

后记:后来又发现Caddy 2还删了其他各种好用的directives,基本上你写完一个配置文件就和Nginx差不多了,简直是开历史的倒车,用户体验极差,不建议升级。

参考