之前用的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/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
搞定了,手动在配置中指定泛域名证书,也挺方便的。
参考
Caddy DocumentationCaddy2 简明教程