caddy配置反向代理和ssl证书申请
下载Caddy
caddy官网下载地址https://caddyserver.com/download。也可以直接点此下载linux amd64版本。 目前最新版本为v2.9.0-beta.3
如果是需要申请泛域名证书则需要勾选对应dns提供商的插件,比如cloudflare
注意:cloudflare不再支持.cf, .ga, .gq, .ml, .tk后缀域名使用api管理dns,也就是这些后缀的域名是不能通过cloudflare申请泛域名证书。
下载之后重命名为caddy拷贝到/usr/local/bin下即可。
配置文件Caddyfile
在任意目录新建一个文件Caddyfile, 推荐位置为/etc/caddy/Caddyfile
输入以下内容, 表示将www.mydomain.cf转发到localhost:16325,并且自动通过let's encrypt申请ssl证书,申请邮箱为my@qq.com. 开启tls则会默认把http重定向到https
www.mydomain.cf { reverse_proxy localhost:16325 tls my@qq.com }
如果是同时开启http和https访问则
www.mydomain.cf:80 www.mydomain.cf:443{ reverse_proxy localhost:16325 tls my@qq.com }
反向代理一般用于后端站点,前端站点则直接可以是静态站点,如果是docker运行的也可以反向代理
以下为静态站点配置,开启https, 站点根目录为/www/vue
www.mydomain.cf { tls my@qq.com root * /www/vue file_server }
启动caddy
运行以下命令即可让caddy进入后台运行。其中/etc/caddy/Caddyfile是配置文件Caddyfile所在路径,--dapter caddyfile表示指定配置文件适配器为caddyfile格式,默认是json,caddyfile也可以翻译为json.
如caddy adapt --config /etc/caddy/caddyfile > /etc/caddy/file.json就是将caddyfile翻译为json并输出,然后caddy start的config参数指定为json文件即可。
caddy start --config /etc/caddy/Caddyfile --adapter caddyfile
caddy start是后台启动,但是日志会在当前控制台输出,关闭当前控制台也会继续运行
caddy run是前台启动,当前控制台关闭进程也会关闭
二者参数一致
证书目录在$XDG_DATA_HOME/certificates/acme-v02.api.letsencrypt.org-directory,$XDG_DATA_HOME在不同系统中对应关系如下
OS | Data directory path |
---|---|
Linux, BSD | $HOME/.local/share/caddy |
Windows | %AppData%\Caddy |
macOS | $HOME/Library/Application Support/Caddy |
Plan 9 | $HOME/lib/caddy |
Android | $HOME/caddy (or /sdcard/caddy ) |
也就是说linux下是~/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory。
修改数据存储目录[可选]
通过修改数据存储目录可以让ssl证书存储到其他路径
Caddyfile增加全局配置storage。如下所示,会把数据目录修改为/etc/ssl/caddy, 这样证书所在路径就变为了/etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory。
需要注意一下的是如果letsencrypt证书获取失败会自动改为获取zerossl的证书,则路径会变为/etc/ssl/caddy/certificates/acme.zerossl.com-v2-dv90
但是需要保证/etc/ssl/caddy存在且当前用户有权限读写和修改,比如 sudo chmod 747 /etc/ssl/caddy -R.
caddyfile内容如下
{ storage file_system { root /etc/ssl/caddy } } www.mydomain.com { reverse_proxy localhost:16325 tls my@qq.com }
添加到systemd运行
新建文件/usr/lib/systemd/system/caddy.service(centos)或者/etc/systemd/system/caddy.service(ubuntu),内容如下. 记得将User=my中my修改为有权限的用户名。
[Unit]
Description=Caddy HTTP/2 web server
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
User=my
Restart=on-abnormal
ExecStart=/usr/local/bin/caddy run --config=/etc/caddy/Caddyfile --adapter=caddyfile
ExecReload=/bin/kill -USR1 $MAINPID
; Use graceful shutdown with a reasonable timeout
KillMode=mixed
KillSignal=SIGQUIT
TimeoutStopSec=5s
ProtectSystem=full
[Install]
WantedBy=multi-user.target
然后执行
systemctl enable caddy.service
systemctl start caddy.service
systemctl status caddy.service
泛域名证书申请和使用
泛域名证书只能通过dns记录来验证,所以需要配置dns提供商的信息
对于.cf, .ga, .gq, .ml, .tk后缀的域名基本就告别自动泛域名证书了,cloudflare不允许通过api调用修改dns,而国内不允许此类域名备案。
1. 安装对应域名提供商的dns模块,常用的国内有阿里云(alidns)和腾讯云(dnspod), 国外有cloudflare 微软(azure) 谷歌(googleclouddns)
可以在下载caddy时勾选对应模块。如果没有勾选也没关系,可以通过命令行下载
cloudflare
caddy add-package github.com/caddy-dns/cloudflare
阿里云
caddy add-package github.com/caddy-dns/alidns
腾讯云
caddy add-package github.com/caddy-dns/dnspod
安装完毕后修改caddyfile, 不同dns提供商的模块配置略微有些区别
cloudflare
将cloudflare_key替换为自己的key, 从这里创建一个dns api令牌即可
*.my.com { tls {
dns cloudflare cloudflare_apikey
} }
阿里云
key_id和key_secret来自控制台创建的accesskey,从这里可以创建,region就是账户所属区域,可不填,默认为 zh-hangzhou
*.my.com { tls { dns alidns { access_key_id key_id access_key_secret key_secret # region_id region } } }
腾讯云
dnspod需要的是api token,由 ID,Token 组合而成的,用英文的逗号分割, 这里有说明如何创建Token. 如id为3245,token为sf3fwr234,则完整的api_token为 3245,sf3fwr234
*.my.com { tls { dns dnspod api_token }
泛域名证书的使用
默认目录配置, 当前用户为my, 域名为my.com
*.my.com {
tls {
dns cloudflare cloudflare_apikey
}
}
www.my.com {
proxy localhost:5000
tls /home/my/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.crt /home/my/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.key
}
修改数据目录为/etc/ssl/caddy后的配置
{ storage file_system { root /etc/ssl/caddy } } *.my.com { tls { dns cloudflare cloudflare_apikey } }www.my.com {
reverse_proxy localhost:8080
tls /etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.crt /etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.key
}api.my.com {
reverse_proxy localhost:5000
tls /etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.crt /etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.key
}