Caddy + Cloudflare 反向代理
前言
现在有一个域名,想用做反向代理,再搭配上 Cloudflare 的 CDN,就可以不用暴露服务器地址和端口了。由于对 HTTPS 证书不熟悉,所以选择了 Caddy ,它可以自动配置 HTTPS,结果成功踩坑。
Caddy 申请证书,Let’s encrypt 会去验证请求的服务器 IP 和 域名解析到的 IP 是否相同,所以一旦打开 Cloudflare 的 CDN,证书就无法申请成功。如果不开 Cloudflare 的 CDN,仅解析 DNS ,又会直接暴露网站源 IP。无法达成需求。
后来发现可以给 Caddy 编译上 tls.dns.cloudflare 模块,通过 Cloudflare 的 API 获取证书,结果 Cloudflare 取消了对 .ml , .tk , .cf 这些免费域名的 API 支持。所以最后只能手动申请证书,修改 Caddy的配置了。此处记录一下操作过程。
Caddy部署
这里是参考官方文档,安装的 Caddy2。
1 | sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https |
手动生成证书并部署
由于 Caddy 自动生成证书,需要使域名指向 Host,无法使用 Cloudflare 的 CDN。因此采用手动生成证书部署的方式进行部署。这里使用 github 的一个开源项目 acme.sh 生成证书。
1. 安装 acme.sh
1 | curl https://get.acme.sh | sh -s email=my@example.com |
2. 生成证书
执行下面这条命令,acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可。
1 | acme.sh --issue --dns -d *.lovecarrot.me --yes-I-know-dns-manual-mode-enough-go-ahead-please |
等待解析完成之后,重新生成证书,下面这个命令会生成一个泛域名证书,这样后期所有在这个域名下的子域名都可以直接使用这个证书。
1 | acme.sh --renew -d *.lovecarrot.me --yes-I-know-dns-manual-mode-enough-go-ahead-please |
将证书复制到一个指定目录,在 Caddyfile 文件中手动指定。Caddyfile 默认位置在 /etc/caddy 这个目录下。我这里新建了一个目录 ssl ,用于存放证书。执行以下命令,将证书拷贝过去。
1 | mkdir /etc/caddy/ssl |
3. Caddyfile 示例
这里就该手动配置 Caddyfile 文件了,我的配置如下。
1 | # 用于裸域做反向代理。 |