Ghost的Nginx cache方式

缓存对于Web网站来说非常重要,可以大大的优化网站的体验的同时一定程度上增加网站的可靠性。当服务所处位置与最终用户地理位置较远时,在用户所在地搭建一个Nginx作为一层缓存能大大优化用户的访问体验。而当服务由于种种原因不可访问时,用户也可以暂时查看缓存中的内容。

目前Ghost,也就是本站,作为第一个在我的那一套网络上使用缓存的网站。我觉得还是可以整理以下本站的缓存方式。


缓存的策略

首先,个人的缓存策略是,只在距离用户最近的一层nginx上做缓存。因此在我的场景下,就只是伪·CDN的一层做缓存,集群等等其他地方均不做缓存。

然后对于每个缓存节点,缓存是2小时有效,但是如果失败了则读取旧缓存。旧缓存最多可以再不被访问的情况下保存一天。

这种策略的意图是,只要一天内被人访问过,那么不论后面的服务是否可访问,用户都不会受到太大的影响。而缺陷是,如果第一个用户访问这个资源的时候,后面的服务不可访问,则用户就会直接遇到无法访问的情况。


具体实现

全局配置

每个缓存节点上的nginx上都有如下代码:

proxy_cache_path /data/cache levels=1:2 keys_zone=default_cache:50m inactive=1d loader_threshold=300 loader_files=200 max_size=500m;

意思是说,在/data/cache这个路径下,然后缓存分了2级。然后允许了50m的key,也就是40w个key。然后缓存文件1天不被访问才会被删除。最后最多储存500m的缓存内容。

loader相关其实不重要,因为每次重新部署我会删除全部缓存。这个是一个坑,可能将来再解决。

服务配置

目前在我的场景下只有本站使用了缓存服务,所以以下内容只针对博客这种以静态网站为主的情景。配置如下:

proxy_cache default_cache;
proxy_cache_valid 2h;
proxy_cache_valid 404 1m;
proxy_ignore_headers Set-Cookie Cache-Control;
proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;

意思是说,使用全局default_cache的那个缓存。缓存默认有效是间是2小时,404只有1分钟的有效时间。然后如果遇到了错误、超时等等异常,允许使用之前的缓存。

这里忽略了header里的cookie和cache-control。因为就是一个静态站,我的意图是不管你是谁,也不管你是觉得这个资源是否敏感,我都缓存住,因为已知内容都是公开内容,所有人都可以看。


缓存这块我目前仍然出于摸索阶段。且用且学习。