抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

caddy

简单介绍

caddy 是一款比较易用的web服务器,相对于nginx来说它的承载量没有nginx高,但是比nginx容易配置一些,另外自动支持ssl证书签发及续约。

目前我有7台服务器,二十多个各类服务,目前已经有3台服务器接近8个服务的访问已经迁移到caddy了,目前访问情况良好,没有使用泛域名证书,使用的是各自的单域名证书,主要是由于都分布在多个服务器上,单域名证书比较合适。

本文主要介绍一下我在试用caddy 遇到的一些问题和配置的详细步骤。

配置过程

step 1:阅读官方文档

官方文档 看看官方对caddy的介绍,以及它的特性,安装方法和配置方法,把文档都看完一遍后,再继续安装caddy并且使用它。

step2:细节调研

这个时候可以搜搜博客,看看有没有写的比较好的,合适的博客,能帮助你进一步减少配置的难度,官方文档写的很碎片化,没有一个完整的配置项并且没有最佳实践,如果阅读各种云服务商的文档,很多都有最佳实践。

我调研的细节主要包括:

  1. SSL证书签发的验证方式,一般是文件验证或者是DNS验证,我一般用DNS的验证,并且我用的是ali的DNS服务器解析,然后找对应的文档就可以
  2. 如何模块化的将caddy的配置文件进行组合,我正常使用NGINX的时候,全部都是使用模块化的配置,把header/CORS/security/domain等等配置都分到各个文件,然后通过排列组合按需选择需要使用的模块
  3. caddy的插件机制,从github下载的官方包是没有插件的,但是caddy相当多的功能是通过插件化的方式来实现的
  4. 支不支持docker或者docker配置容不容易等等

通过以上的细节,找了很多博客和官方文档,然后正式开始了安装和配置细节。

step3:安装caddy

安装caddy 主要通过2两种方式:

  1. 以centos为例,直接把caddy的二进制文件copy到/usr/local/bin/ 文件夹中,然后 chmod +x /usr/local/bin/caddy 给执行权限,直接控制台输入 caddy就可以看到caddy安装成功了。
  2. 直接使用docker-compose或者docker安装

这里我使用的是第一种方式,因为我使用了模块化的管理,需要安装插件(安装插件需要重新编译)。

  1. 对标nginx的access.log,需要对站点的日志进行格式化输出,所以需要安装插件:caddyserver/transform-encoder 来实现日志的自定义格式输出
  2. SSL的证书自动签发我使用的是aliDNS的方式,这时候也要安装插件:caddy-dns/alidns

如果使用docker安装,需要重新用官方的Dockerfile进行重新编译打包,如果升级更新还是稍微有些麻烦,所以我选择了直接二进制文件安装。

安装很简单:

直接到官方网站:download-caddy选择你的系统,以及需要安装的插件,然后直接下载下来就可以。

download

之后就直接通过scp 把文件上传到云服务器,scp caddy_linux_amd64_custom host:/usr/local/bin/caddy 一步到位。

给caddy执行权限:chmod +x /usr/local/bin/caddy 这样就完成了caddy的安装

执行一下caddy version 看看你安装的版本。

step4:配置caddy

配置文件主要分为两部分:

  1. 将caddy配置为linux的服务,然后开机启动啥的
  2. caddy本身的配置,和你需要配置的domain的配置

配置caddy为linux服务,并且开始启动

执行:vi /etc/systemd/system/caddy.service 然后将以下内容填充进去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target


[Service]
User=root
Group=root
ExecStart=/usr/local/bin/caddy run --environ --config /usr/local/bin/Caddyfile
ExecReload=/usr/local/bin/caddy reload --config /usr/local/bin/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

然后执行:

  • systemctl daemon-reload 刷新系统后台
  • systemctl enable caddy 设置caddy开机启动
  • systemctl status caddy 看看caddy的状态

这里没有直接启动caddy,因为service中指定了caddy的配置文件--config /usr/local/bin/Caddyfile,所以我需要先编辑好配置文件再启动。

配置caddy 和domain

先配置caddy的Caddyfile文件,caddy配置模式让我觉得配置比nginx要人性化点,简单省事。

执行vi /usr/local/bin/Caddyfile

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#支持直接#号写注释,这里主要使用了上文提到的caddyserver/transform-encoder插件
(LOG) {
log {
# 日志格式参考 https://github.com/caddyserver/format-encoder 插件文档
time_format "iso8601"
}
output file "{args.0}" {
roll_size 100mb
roll_keep 3
roll_keep_for 7d
}

#SSL证书协议
(TLS) {
protocols tls1.2 tls1.3
}

# HSTS (86400 seconds)
(HSTS) {
header / Strict-Transport-Security "max-age=86400"
}

#这里是aliDNS配置证书自动签发
(ACME_GANDI) {

dns alidns {
access_key_id "ak"
access_key_secret "aks"
}
}

#后端的CORS可以按需配置
(CORS) {

@options {
method OPTIONS
}
header {
Access-Control-Allow-Origin *
Access-Control-Allow-Credentials true
Access-Control-Allow-Methods *
}
respond @options 204
}


# 这个是给domain配置的一个以上细节配置的集合体
(COMMON_CONFIG) {
# 压缩支持
encode zstd gzip

# TLS 配置
tls {
import TLS
import ACME_GANDI
}

# HSTS
import HSTS
}

# 开启 HTTP3 实验性支持
{
servers :443 {
protocol {
experimental_http3
}
}
}


#引入authelia 这个是我的sso配置
(AUTH) {
forward_auth https://auth.abc.com {
uri /api/verify?rd=https://auth.abc.com/
copy_headers Remote-User Remote-Groups Remote-Name Remote-Email
}
}

# 引人他具体的站点配置(一个域名一个domain.caddy文件)
import /data/caddy/domain/*.caddy

然后创建文件夹mkdir -p /data/caddy/domain/

进入文件夹创建一个域名对应的访问cd /data/caddy/domain/ && touch blog.songbo.fun.caddy

修改对应的domain文件:vi blog.songbo.fun.caddy ,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#直接写域名,自动给你支持了80->443端口,和证书等签发
blog.songbo.fun {
#引入authelia-按需引入
import AUTH
# 路由地址-按需配置
route /* {
#反向代理
reverse_proxy 127.0.0.1:80
}

# 日志存放地址
import LOG "//data/caddy/domain/logs/blog.songbo.fun.log"

# TLS、HSTS、ACME 等通用配置
import COMMON_CONFIG
# 按需选择cors配置
import CORS
}


到这一个简易的caddy 配置就完成了,可以启动caddy,然后先看看caddy是否启动正常,然后再访问网站看能不能访问,证书是不是刚签发的。

  • 启动caddy:service caddy start
  • 查看caddy 启动状态和日志,如果是running,那就是正常 service caddy status -l
  • 如果嫌caddy的配置你改完之后,看着难看,可以直接进行格式化,overwrite 会自动重写你的文件: caddy fmt -overwrite 你的文件
  • SSL证书实际存放地址:~/.local/share/caddy/certificates,可以根据官方文档自行进行配置

caddy的简单配置就是以上的内容,它的语法在官方文档中能看到,可以对照语法来看整个配置文件,虽然配置是Caddyfile,但是它实际上还是以json的形式来运行的,它内部有方法可以直接将caddy转化为Json,可以在官方文档去寻找和配置你想要的细节,等等。

结果

查看了官方文档,然后看了很多博客之后,成功实现了从nginx转到caddy的任务,其中也有一些探索,包括CORS的配置等等,语法上使用是比nginx稍微简单点,但是它的报错信息不是很明显,需要转化成json去看,目前稳定运行了几天,还是比较简单。

caddy天然支持监控,可以使用Prometheus去采集数据,并在Grafana上进行展示,这些在官方文档中有,其中最重要的就是要注意安全问题,给caddy也配置上安全header等等配置,目前的caddy的文档不是特别的多,很多功能还是需要自己探索。

如果有相关问题,欢迎一起探索和交流。

评论