最近在尝试配置网站的https,师兄推荐了Caddy来替换nginx,作为web server。Caddy采用golang语言编写,很容易安装,而且能自动帮助用户注册用于https的证书。

关于Caddy的安装和配置,这篇博客做了非常详细的介绍。我会按照我的配置重新复述一下,并且重点强调配置caddy.service服务时要注意的权限问题。

Caddy 安装

Caddy官网提供了自定义安装组件的方式,用户可以通过定制platform,plugins,telemetrylicense来生成caddy安装文件并下载。这里不建议采用curl -s https://getcaddy.com | bash脚本方式安装,因为会提示用户没有选择license

下载完成后,采用如下方式安装到系统的/usr/local/bin目录下,

1
2
3
4
$ mkdir caddy
$ cd caddy
$ tar -xvf ../caddy_v0.10.12_linux_amd64_custom_personal.tar.gz
$ sudo cp caddy /usr/local/bin/

Caddyfile

与nginx类似,Caddy也需要采用配置文件的方式读取server的信息,这里默认的配置文件名为Caddyfile。针对单host和多host,会有细微的区别,下面我分别列出配置文件的写法,

Single host
1
2
3
4
5
6
7
8
9
10
11
xxx.com
gzip
log /var/log/caddy/xxx.log
root /home/wwwroot/xxx/
# PHP backend
fastcgi / 127.0.0.1:2345 php {
index index.php index.html
}
rewrite {
to {path} {path}/ /index.php?{query}
}
Multiple hosts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
xxx.com {
gzip
log /var/log/caddy/xxx.log
root /home/wwwroot/xxx/
# PHP backend
fastcgi / 127.0.0.1:2345 php {
index index.php index.html
}
rewrite {
to {path} {path}/ /index.php?{query}
}}
yyy.com {
gzip
log /var/log/caddy/xxx.log
root /home/wwwroot/yyy/
# PHP backend
fastcgi / 127.0.0.1:2345 php {
index index.php index.html
}
rewrite {
to {path} {path}/ /index.php?{query}
}}

可以看出,如果要配置多个hosts,在每一个host的名称后用{}包含配置信息即可,其目的是让Caddy能区分不同的host.

配置candy.service

通常我们会将web server配置成系统的服务程序,运行在后台,Caddy也提供了相应的caddy.service的脚本,其下载和添加方法为,

1
sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service

打开caddy.service,其存储路径为/etc/systemd/system/,其中有几个部分需要注意和修改,例如执行该服务的用户及用户组,Caddyfile配置文件的路径,以及ssl证书的存储路径等。如果没有配置好,caddy服务会无法正常运行。

1
2
3
4
5
6
7
8
9
10
; User and group the process will run as.
User=root # 原文为 www-data
Group=root # 原文为 www-data
; Letsencrypt-issued certificates will be written to this directory.
Environment=CADDYPATH=/etc/ssl/caddy
; Always set "-root" to something safe in case it gets forgotten in the Caddyfile.
ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
ExecReload=/bin/kill -USR1 $MAINPID

根据caddy.service文件的要求,我们需要新建一系列的文件夹,用于存放caddy生成的文件。

1
2
3
$ sudo mkdir /etc/caddy
$ sudo cp <path of the Caddyfile> /etc/caddy/Caddyfile
$ sudo mkdir /etc/ssl/caddy

完成以上操作以后,即可运行并查看Caddy的运行状态,运行前要记得关闭nginx服务,否则会提示80端口被占用。

1
2
3
$ sudo systemd daemon-reload # 重新加载systemd
$ sudo systemd enable caddy.service
$ sudo systemd status caddy.service # 查看caddy运行状态

测试

最后,打开浏览器,输入https://xxx.com,便可以查看是否配置成功。

References