HydroOJ 从入门到入土(6)Caddy 设置自动SSL证书

发布时间 2023-12-08 17:13:44作者: Bowen404

Caddy 既出, 何需 Nginx?

1. Caddy 是啥

Caddy 是用来替代 Nginx 的新一代反代工具, 配置简单很多.

有了 Caddy, 就不要再装 Nginx 了, 不然会冲突.

官方文档地址: https://caddyserver.com/docs/

中文文档地址: https://dengxiaolong.com/caddy/zh/caddyfile.html

Caddy 介绍 (中文): 使用 Caddy 替代 Nginx,全站升级 https,配置更加简单

2. Caddy 配置简介

# 如果你希望使用其他端口或使用域名,修改此处 :80 的值后在 ~/.hydro 目录下使用 caddy reload 重载配置。
# 如果你在当前配置下能够通过 http://你的域名/ 正常访问到网站,若需开启 ssl,
# 仅需将 :80 改为你的域名(如 hydro.ac)后使用 caddy reload 重载配置即可自动签发 ssl 证书。
# 清注意在防火墙/安全组中放行端口,且部分运营商会拦截未经备案的域名。
# For more information, refer to caddy v2 documentation.
# :80 {  # 这是 http 的访问端口, 注释掉之后就不能通过 http 的域名访问
a.com, www.a.com, b.com {  # 写了域名就会给域名自动签发 SSL 证书, 也就是开启 https 访问, 注意防火墙开启 443 端口. 多个网站之间用`, `来隔开, 注意逗号后边有空格.
  log {  # log 文件默认上限 1gb, 可能会比较大, 但是会自动压缩, 需要改小自己调
    output file /data/access.log {
      roll_size 1gb
      roll_keep_for 72h
    }
    format json
  }
  # Handle static files directly, for better performance.
  root * /root/.hydro/static  # 静态文件目录
  @static {
    file {
      try_files {path}
    }
  }
  handle @static {  # 处理静态文件的方式
    file_server {
      precompressed br gzip  # 这里可以开启高压缩比算法, 节约流量, 使用方法见下方
    }
  }
  handle {  # 这里是动态代理地址, 如果有其他服务, 可以下边再开一个地址写不同的端口
    reverse_proxy http://127.0.0.1:8888
  }
}


c.com {
  
  # 中间这些可以照着上边写, 也可以自己改
  
  handle {  # 代理到一个不同的服务商
    reverse_proxy http://127.0.0.1:9999
  }
}

# 如果你需要同时配置其他站点,可参考下方设置:
# 请注意:如果多个站点需要共享同一个端口(如 80/443),请确保为每个站点都填写了域名!
# 动态站点:
# xxx.com {
#    reverse_proxy http://127.0.0.1:1234
# }
# 静态站点:
# xxx.com {
#    root * /www/xxx.com
#    file_server
# }

3. 使用 gzip / br 节省带宽

gzip 通用性比较强, 后来 Google 搞出了 brotli(br) 算法, 压缩比更高, 比 gzip 体积小 20-30%左右, 新版浏览器基本都支持.

caddy 可以启用实时 gzip, 也有限支持 br, 但如果要实时 br...这东西性能有点糟糕所以被改成插件了(原因看这里).

如果想用更高压缩比的 br 算法, 可以使用预压缩(precompressed), 也就是先全部压缩好, 放在要使用的文件旁边, 这样 caddy 会自动根据浏览器的支持程度选用合适的压缩文件.

3.1 先把静态文件全部压缩

安装 brotli

sudo apt install brotli

之后 cd 到需要压缩的文件夹(注意备份), 比如/root/.hydro/static 然后在文件夹中执行一行 bash 命令, 即可完成对整个文件夹进行递归压缩(gzip 和 br 各一份), 并保留源文件(caddy 要求).

find ./ -type f -size +1400c \
    -regex ".*\.\(css\|html\|js\|json\|svg\|xml\)$" \
    -exec brotli --best {} \+ \
    -exec gzip --best -k {} \+

尽量挑选 cpu 空闲时间干活.

参考资料: https://misterorion.com/caddy-server-brotli/

3.2 caddyfile 中开启 precompressed 选项

配置如上, 如:

  ...
  handle @static {  # 处理静态文件的方式
    file_server {
      precompressed br gzip  # 这里可以开启高压缩比算法, 节约流量, 使用方法见下方
    }
  }
  ...

然后 caddy reload

3.3 查看是否成功

浏览器调试界面, 网络 tab, 打开 Content-Encoding 选项, 应该能看到 gzip 或者 br 了.

不行的话, 可以检查上方操作, 或者清空浏览器缓存再试.