Caddy相比Nginx而言部署配置简单,自动签发证书更是十分方便,v2版本正式发布一段时间了,变动较大,文档也比较匮乏,稳定使用一段时间后记录下从v1升级到v2的注意事项,以免掉坑里。

给主要服务搭建Web服务器还是建议nginx作为前端配合apache作为后端,毕竟性能最好,文档和资料也丰富,配置好就不用管了,少折腾。

卸载v1

之前是用逗比的脚本安装的,卸载很简单:

1
2
sudo su
bash caddy_install.sh uninstall

安装Caddy 2

CentOS 7

1
2
3
4
5
sudo su
yum install yum-plugin-copr
yum copr enable @caddy/caddy
yum install caddy
exit

系统安装的caddy主程序位于/bin/caddy,HOME目录位于/var/www
提供绑定端口的系统权限。

1
sudo setcap cap_net_bind_service=+ep $(which caddy)

需注意caddy.service要求systemctl版本至少232,而centos7是219,不要使用。
编辑/etc/caddy/Caddyfile配置文件,具体见下文。
验证配置文件。

1
caddy validate --config /etc/caddy/Caddyfile

若无报错则运行。

1
sudo -u caddy caddy start --config /etc/caddy/Caddyfile

若希望开机自动运行则用crontab添加一条命令,频率用@reboot

php-fpm

安装php-fpm以及相关插件。

1
sudo yum install php-fpm php-xml php-mbstring php-tidy

修复安全漏洞。

1
sudo sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php.ini

修改用户和用户组为caddy

1
2
sudo sed -i 's/user = apache/user = caddy/g' /etc/php-fpm.d/www.conf
sudo sed -i 's/group = apache/group = caddy/g' /etc/php-fpm.d/www.conf

运行并启用php-fpm

1
2
sudo systemctl start php-fpm
sudo systemctl enable php-fpm

访问报错Access Deny.

因为caddy把/var/www设为$HOME了,所以需开启Web服务器对HOME目录的读权限。

1
sudo setsebool -P httpd_read_user_content 1

Ubuntu Server 20.04 LTS

ubuntu的安装比centos要简单一些。
添加源并安装caddy。

1
2
3
4
echo "deb [trusted=yes] https://apt.fury.io/caddy/ /" \
| sudo tee -a /etc/apt/sources.list.d/caddy-fury.list
sudo apt update
sudo apt install caddy

系统安装的caddy主程序位于/usr/bin/caddy。自动签发的证书位于/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/
创建网页文件夹并设定相关权限。

1
2
sudo mkdir -p /var/www/example.com
sudo chown -R caddy:caddy /var/www

官方安装包忘了创建log文件并设定相关权限。

1
2
sudo touch /var/log/caddy.log
sudo chown caddy:caddy /var/log/caddy.log

编辑/etc/caddy/Caddyfile配置文件,具体见下文。
验证配置文件。

1
caddy validate --config /etc/caddy/Caddyfile

若无报错则重启服务。

1
sudo systemctl restart caddy

php-fpm

安装php-fpm以及相关插件。

1
sudo apt install php-fpm php-xml php-mbstring php-tidy

修复安全漏洞。

1
sudo sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/7.4/fpm/php.ini

修改用户和用户组为caddy

1
2
sudo sed -i 's/user = www-data/user = caddy/g' /etc/php/7.4/fpm/pool.d/www.conf
sudo sed -i 's/group = www-data/group = caddy/g' /etc/php/7.4/fpm/pool.d/www.conf

运行并启用php-fpm

1
2
sudo systemctl start php7.4-fpm
sudo systemctl enable php7.4-fpm

Caddyfile常用示例

带SSL的静态网页服务器

1
2
3
4
5
6
7
8
example.com {
log {
output file /var/log/caddy.log
format single_field common_log
}
root * /var/www/example.com
file_server
}

log部分设定输出为文件。root设定网页根目录。file_server会自动渲染根目录下的index.html
后面示例以此作为模板添加相关语句即可。

动态网页服务器

由v1的fastcgi改为php_fastcgi

1
php_fastcgi /path/* unix//run/php/php7.4-fpm.sock

透明代理

v2默认为transparent,故无需像v1那样指定,但子路径最后需添加斜杠和通配符,否则会404。

1
reverse_proxy /path/* 127.0.0.1:1234

反向代理WebSocket服务

ws的路径则不用通配符。

1
2
3
reverse_proxy /path 127.0.0.1:1234 {
header_up -Origin
}

设定带密码保护的文件管理服务

以密码12345为例,先计算哈希值。

1
caddy hash-password --plaintext 12345

然后配置如下。

1
2
3
4
5
6
basicauth /path/* {
username JDJhJDEwJG9uR1ZsOHNTWVdKWllJOGk5SnpMUC40d3FabVYvc0p4eTZNdGZYTGVSeDhsNkw2bjJSY202
}
file_server /path/* {
browse
}

Caddy API

v2改成使用json作为配置文件格式,即便使用Caddyfile也是先转换为json。并且可以用REST API通过HTTP协议进行及时更改。好处就是调试方便,可编程。但个人而言,网页服务器配置很少改动,所以更倾向使用传统的Caddyfile来配置。
想多了解的可以查看官方文档API

将配置文件转换为json

1
caddy adapt --config /etc/caddy/Caddyfile --adapter caddyfile > example.com.json

参考资料

Download Caddy
Caddy Upgrade Guide
Install a LEMP Stack on CentOS 7