原来用的Caddy1,后来发现官网上只有新的2.0的二进制文件了,不过原来用的1.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
}


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

webdav和file_server

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

 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 简明教程