西西河

主题:【原创】网站,没有缓存怎么行,520码 -- 铁手

共:💬12 🌺29 新:
全看分页树展 · 主题
家园 【原创】网站,没有缓存怎么行,520码

最近一段时间网站出现大量520错误返回。目前我用 cloudflare 来加速内容访问。基本原理是用户访问西西河,实际上是到 cloudflare 要内容,cloudflare 作为中间人在必要时到我的服务器要内容。这个520错误返回,是我服务器和 cloudflare 之间的问题。经过大量排查,特别是各种试图,也没法在 web server 的 log里找到对应的错误信息后,现在基本确定是因为 cloudflare 程序认为我的服务器响应太慢有关。正好我一直想找时间把西西河的缓存机制理清一下,现在问题找上门来,就赶紧抓紧完善一下。

欢迎帮忙质疑,并帮忙改进实施方案。我是三脚猫的功夫,所以特别希望来点实锤。

每个网页的内容生成,在后台基本上涉及到数据库、程序计算、缓存机制设定。

数据库方面的优化,这里暂时略过。将来可能转到 pgsql(是好注意么?),准备专注到那里。

后台程序根据内容生成网页。程序里对一些局部操作的内容做了缓存,可以减轻数据库和程序计算的负担。

在此基础上,希望通过访问缓存机制来尽可能减少对服务器的直接需求。尽可能让内容从本地或者是代理缓存那里获得,而不是每次都要从服务器那里取。

对返回给浏览器的内容设定缓冲控制,要考虑两个方面:一是缓存时间,要考虑静态和动态内容,二是缓存所在,要考虑用户终点(私缓)和中间代理CDN(公缓)。

象 Javascript 或 CSS,及一些图片,原则上一旦确定基本上不变,缓存时间可以长一些,这个在 Web server 中可以设定。

在后台程序生成的内容页面中,一部分内容中长期不变化,一部分内容短期变化频繁,还有一部分和用户是否在线有关。以看一个帖为例,帖内容中长期不变,帖得花变化会比较频繁,对作者的屏蔽或趋订则和用户在线有关。缓存策略可以分别为公缓长、公缓短、私缓,必要时通过ETAG到后台验证。

随着技术的发展和应用,考虑以后每个页面都根据上述分析分为三个访问请求,对每个请求采用不同的缓存策略。

Cache-Control 的一些参数和解释。

缓存控制有关。

public:能被所有缓存使用,包括代理CDN

private:只能由终点用户缓存。

no-store:不做缓存

no-cache:缓存,但下次访问,则必须先到源服务器去验证是否有变。

缓存时间有关

max-age=seconds 秒钟计算。

s-maxage=seconds 代理缓存时间,和终点用户无关。似乎没道理需要和max-age不一致。可不用。

缓存验证有关

must-revalidate 如果缓存过期,需要到源服务器确认之后,才能使用。

proxy-revalidate 同上,但只和代理有关。

immutable 在期限内不会改变,因此不用到源头验证。

no-cache 和 max-age=0, must-revalidate 等效,每次都需要去源服务器去验证。

在只有 max-age=0 时,如果网络不通,则缓存可用。

另外需要注意,如果内容返回带有 cookie,代理基本上应该不会缓存。

则,对于公缓,如果有效期限比较确定的,可类似

Cache-Control: public, max-age=86400

对于公缓,如果有效期限不确定,需要到源服务器确认

Cache-Control: public, no-cache

Cache-Control: public, no-cache, must-revalidate (must-revalidate 这里不需要吧?保险起见?)

对于私缓,根据上述两种情况,用 private 替换 public 就可以。

对于一些特殊情况,完全不缓存的

Cache-Control: no-store, max-age=0

比如:之前有缓存,但是改成不缓存,硬刷新后,如果没有 max-age=0,则内容还可以从旧的缓存来,有 max-age=0 则会导致刷新。

大致就这样。欢迎补充。

关键词(Tags): #网站缓存#拓宽河道通宝推:海峰,桥上,
全看分页树展 · 主题


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河