为caddy添加反代缓存(reverse proxy cache)

我的博客使用caddy作为反向代理,博客部署在云内网,贪的是caddy的自动证书、简单化的配置、使用简单、性能相比nginx还不错。

部署起来,三下五除二就搞定了,剩下的时间够喝咖啡。

这个架构运行有一段时间,还是发现一些静态资源在caddy这里回源,这一部分是可以优化的,毕竟静态资源确实修改很少很少,大部分是从上传到网站那一刻起就再也没修改过,这一部分资源在caddy这里缓存了最好。

经过在caddy官方文档以及谷歌的一阵资料搜索,我已经成功在caddy开启了http cache功能,效果如下

caddy http cache hit

网站的响应速度也明显比之前快不少。

反向缓存配置

这里使用的是sillygod/cdp-cache,但这个插件并没有集成到官方发布的caddy发行版中,如果想使用,需要自己使用xcaddy或者go编译进caddy运行文件。我这里就没有那么折腾了,直接使用docker镜像,这是已经包含了http cache插件的镜像。

docker pull ghcr.io/sillygod/cdp-cache/caddy:latest

配置信息很简单,我在这里配置一些静态资源直接在caddy缓存,并且缓存在内存,不保存。如果需要保存在文件或者其他数据库,可以参考官方案例

{   # 先读取http cache,失败再回源,这是caddy本身的配置
    order http_cache before reverse_proxy
}

cdn.site.com {
    reverse_proxy {
        to orgin.site.com
    }

  http_cache {  # 针对各个站点的cdn配置
    #cache_type file 
    #path /tmp/cache
    cache_type in_memory
    match_path /
    match_header Content-Type text/css text/javascript application/javascript image/jpg image/png "text/plain; charset=utf-8"
  }
}

运行镜像,并把原先已经配置好的caddy配置文件映射进镜像,运行命令

docker run --name caddy_cache \
  -d --rm \
  --network=host \
  -v /etc/caddy:/app/etc/caddy \
  ghcr.io/sillygod/cdp-cache/caddy:latest \
  /app/caddy run --environ --config /app/etc/caddy/Caddyfile

注:启动命令说明,使用本机网络,直接占用80、443端口,映射/etc/caddy配置目录,并自定义caddy运行命令。

运行之后,可以进docker镜像里面查看这个caddy所包含的module,命令是caddy list-modules,只要有http_cache的模块在,就支持上面的http_cache写法。

# docker exec -ti caddy_cache sh
/app # ./caddy list-modules
....
admin.api.purge
caddy.logging.writers.influxlog
caddy.storage.consul
distributed.consul
http.handlers.http_cache

  Non-standard modules: 5

  Unknown modules: 0

而apt所安装的caddy只包含了标准module,并没有这个http.handlers.http_cache模块。

总结

再加几台caddy并启用Http_cache,域名多IP解析,就近解析到最近的caddy,并缓存变更小的数据,不就是微型的CDN。

另外对于静态文件或者长时间不修改的文件来说,每次请求都要从源服务器要数据,响应时间比较长。增加缓存之后,可以提高响应速度,也就是CDN的效果。

有时间来试试

  1. 插件还有几种缓存模式,
  2. 配置文件还有许多配置项没用到,可以配置的更符合需求。
  3. 在ubuntu使用xcaddy编译caddy,并与原生的caddy共存

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Scroll to Top