切换至Caddy2

目录

之前用的Caddy1,后来发现官网上只有新的2.0的二进制文件了。最近Caddy服务重启的时候总是很慢,kill -10重载配置也没反应,体验很差,索性换到Caddy2…

安装

二进制文件

官网 下载,简单粗暴。可以勾选各种额外功能包,我选了 caddy-webdav 用来做webdav文件管理, cloudflare 用于申请tls证书(后来实测没用,还是 acme.sh 好用)。最后选择平台下载。

Linux服务

参见官方文档的 Linux service
二进制文件放到 /usr/bin

创建一个 caddy 组和用户专门运行这个服务:

sudo groupadd --system caddy
sudo useradd --system \
    --gid caddy \
    --create-home \
    --home-dir /var/lib/caddy \
    --shell /usr/sbin/nologin \
    --comment "Caddy web server" \
    caddy

选择官方的服务配置文件下载,Caddy2有两种配置方法,一种是 API模式 ,另一种是和原来比较相似的 Caddyfile配置 ,我选的后者,修改和维护比较方便, caddy.service

保存到 /etc/systemd/system/caddy.service

重载服务配置

sudo systemctl daemon-reload

启动并查看caddy运行状况

sudo systemctl start caddy
sudo systemctl status caddy

配置

配置部分比较麻烦,特别是看到官方的文档以后…直接使用以前的配置是完全不行的。

配置结构

配置默认还是以一个 Caddyfile 作为入口,存放主要的全局配置等内容;像 nginx 一样引入子配置,每个站点单独配置,易于管理。

/etc/caddy/Caddyfile
/etc/caddy/site1.xxx.xx.caddy
/etc/caddy/site2.yyy.xx.caddy

下面是一个 Caddyfile 的例子

{
    auto_https off
    http_port 1984
    https_port 1989
}

(COMMON_CONFIG) {
    encode zstd gzip
}

(SITE_XXX_XX_TLS) {
    tls  /etc/letsencrypt/live/XXX.XX/fullchain.pem /etc/letsencrypt/live/XXX.XX/privkey.pem
    protocols tls1.2 tls1.3
}

import /etc/caddy/*.caddy

第一段 {} 代表的是全局选项,我这里修改了默认的http和https端口,关闭自动https。更多设置见官方文档 Global options

后面两段可以认为是具有命名的配置片段,如 COMMON_CONFIG 就是一个命名,在 Caddyfile 和其它 *.caddy 文件中可以插入。 SITE_XXX_XX_TLS 内配置了TLS协议和证书,这里申请的是泛域名证书,我就可以在同一主域下的所有配置文件中通过 import SITE_XXX_XX_TLS 插入,不必重复写一长串。

最后 import /etc/caddy/*.caddy 即是引入具体站点配置。

https://abc.xxx.xx:4399 {
    import COMMON_CONFIG
    import SITE_XXX_XX_TLS

    reverse_proxy http://127.0.0.1:1234
}```

  这是一个简单的反向代理的配置,这里结构和
  <code>
   caddy1
  </code>
  差不多,通过
  <code>
   import COMMON_CONFIG
  </code>
  
  <code>
   import SITE_XXX_XX_TLS
  </code>
  引入
  <code>
   Caddyfile
  </code>
  内的配置片段,
  <code>
   reverse_proxy
  </code>
  就是之前的
  <code>
   proxy
  </code>
  。这样一个简单的配置就完成了,可以试着重启
  <code>
   caddy
  </code>
  

  webdav和file_server

  我这个web页面主要是用于访问文件,要用到webdav和file_sever。

```Caddyfile
 webdav /webdav/* {
            root /mnt/M/share/
            prefix /webdav
        }
webdav 后面代表匹配的路径,在访问 /webdav/xxx 这类子路径时生效, root 代表文件系统路径, prefix 前缀用于修正访问文件目录的路径,比如访问 /webdav/img/1.png ,如果没有设置 prefix ,默认就会去文件系统访问 /mnt/M/share/webdav/img/1.png ,加上 prefix 参数,系统就会知道访问路径开头的 /webdav 是需要去掉的。

这个 webdav 不能像 caddy1 一样设置只读,所以只能通过配置要访问的文件对运行服务的 caddy 用户的读写权限实现。

root * /mnt/M
file_server /share/* browse
file_server 需要设置 root '根目录', file_server 后面的 /share/* 即是匹配路径,也是文件系统的相对路径,这里把 /mnt/M 设为根目录,访问 /share/XXX 时会去访问文件系统的 /mnt/M/share/XXXbrowse 参数会在访问时显示默认的页面,方便检索,这个页面和 caddy1browse 是一样的。

因为匹配路径的问题,默认访问 /share/webdav 会404,使用 redir /share /share/ 重定向可以解决。

file_serverwebdav 同时使用时,需要加上 route ,原因不太清楚。

route {
    webdav /webdav/* {
        root /mnt/M/share/
        prefix /webdav
    }
}

root * /mnt/M
file_server /share/* browse

basicauth

这个主要是配置里面的密码从明文变成了哈希串的base64编码,并可以设置哈希算法(默认是bcrypt)。
在线计算 生成bcrypt ,再进行 base64编码 ,就是需要填入配置中的密码。

如密码 github 得到的结果可能是 JDJhJDEwJHpranZHRmliampldDgzaGRyc1B1cWVteHhnWUNic0xvU0VTaHg3RERJY0JYekxLWW5lbEND

 basicauth /share/* {
            git DJhJDEwJHpranZHRmliampldDgzaGRyc1B1cWVteHhnWUNic0xvU0VTaHg3RERJY0JYekxLWW5lbEND
        }

tls

因为不是标准端口的网站,没办法用文件的方式自动申请证书。一开始用 cloudflare 模块,试了很久不行,总是提示在后台申请证书,没个结果。后来还是用 certbot 搞定了,手动在配置中指定泛域名证书,也挺方便的。

参考

Caddy Documentation
Caddy2 简明教程