切换至Caddy2
原来用的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/XXX
,browse
参数会在访问时显示默认的页面,方便检索,这个页面和caddy1
的browse
是一样的。
因为匹配路径的问题,默认访问/share
及/webdav
会404,使用redir /share /share/
重定向可以解决。
当file_server
和webdav
同时使用时,需要加上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搞定了,手动在配置中指定泛域名证书,也挺方便的。