Hegwin.Me

疏影横斜水清浅,暗香浮动月黄昏。

使用Caddy作为反向代理服务并获取HTTPS证书

Use Caddy as reverse proxy server with free HTTPS certificate

因为之前更换服务器OS镜像,数据丢失,我的 blog 服务停了几个月,中间又遇到我父亲中风,在老家照顾了4个多月,一直没时间打理个人博客。今天终于把它修回来了。

在这中间我做了不少更新,Ruby的版本从1.9更新到了2.7,Rails也从3.2更新到了5.2,很多手动部署的过程,也改成了自动部署。另外比较新的一点尝试就是,我用 Caddy 代替了 Nginx 做反向代理服务器,并且利用它直接获得了 HTTPS 证书,非常便利。

之前是利用Nginx做反向代理 + acem.sh 做证书,这次是用Caddy一次性完成了他们俩原来的功能:

  1. Nginx:
    1. 监听80/443端口并将服务转发到对应的app服务(此处是rails)
    2. rails服务器我启在多个端口上,所以nginx也做了负载均衡
    3. 显示将http访问重定向到https
    4. 对于JS/CSS等静态文件,直接传输
  2. Acem.sh
    1. 颁发 https 证书
    2. 证书到期后 renew 证书(需要自己加cron)

而如果使用 Caddy,那么以上的功能只需要它就可以完成了,这是我遇到的Caddy的优点:

  1. 不需要自己管理和配置HTTPS证书
  2. 不需要自己配置HTTP到HTTPS的跳转
  3. 负载均衡的策略配置非常简单,感觉它的默认配置也不错

简直是懒人福音,基本上什么都不需要自己写,以下就是我的配置文件的全部内容了:

hegwin.me {
    root * /var/www/blog/current/public/
    route {
        file_server /assets*
        reverse_proxy :4000 :4001 :4002
    }
}

Caddy 的安装和使用

在最早的 blog 服务器上,操作系统是 Ubuntu 12.04,不管 Ruby 也好 Postgres 也好,都是下载源码自己编译的。现在也不想这么折腾,几乎都是用 apt 安装的,caddy 也是可以直接apt 安装。

官方的安装文档里有关于在 Ubuntu 下的安装指南。我也是照猫画虎执行一通之后发现有些和预期不一样的效果,官方给的 Ubuntu 的安装步骤是这样:

$ sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
$ sudo apt update
$ sudo apt install caddy

这个步骤安装完倒是没什么问题,执行 caddy version,也能正常返回,只是 systemctl 里只有 caddy-api.service 没有 caddy.service,而使用 caddy start 也不会默认去读取 /etc/caddy/Caddyfile

于是我找到了这篇 blog: 用RaspberryPi搭建Aria2+Caddy2下载站 ,后续还有一些步骤如下:

$ wget https://github.com/caddyserver/dist/blob/master/init/caddy.service # 下载 caddy.service
$ sudo mv caddy.service /etc/systemd/system/caddy.service

而后就这可以正常使用 systemctl 去控制 Caddy 了,比如 systemctl status caddy;我个人还是建议这样操作,可以避免一些麻烦,比如 443 端口的权限问题。

之后就是配置 Caddyfile 即可:

sudo touch /etc/caddy/Caddyfile
sudo vim /etc/caddy/Caddyfile

对于 Rails app 来说,如果你没有用 webpacker 那配置如下:

hegwin.me {
    root * /var/www/blog/current/public/
    route {
        file_server /assets*
         # 如果用 puma 或者 unicorn 可以直接用 unix domain socket,我直接用的 thin
        reverse_proxy :4000 :4001 :4002 
    }
}

如果用了 webpacker 的话,把 file_server 这一行换成 file_server /packs* 就好。

保存后刷新一下:

systemctl reload caddy

哦对,记得把 apache 或者 nginx 关掉,他们有可能已经在占用 80/443端口。我记得 Ubuntu 12.04 默认是启用 apache,换成nginx还要先关闭 apache。我现在用的 Ubuntu 22.04,非常开心的是,他没有指定默认的 http server,不管是 apache 还是 nginx,都没有先入为主的帮你指定。

< Back