缓存

设置缓存

可以在服务”设置” – “缓存”中设置本服务是否开启缓存,以及缓存的条件: Cache1.png

文件缓存性能指南

建议使用SSD硬盘可以显著提升文件的写入和读取速度。

使用文件缓存时,可以设置”内存最大容量”,如果此值大于0,则缓存在创建时会优先写入内存,然后再定期导入磁盘。如果设置了内存容量,系统也会定期将热点内容写入内存,以提升性能。

缓存文件句柄缓存

从v0.4.0开始,可以设置”缓存文件句柄缓存”来显著提升缓存文件的打开速度,设置了缓存文件句柄后,缓存文件打开后,会将句柄放入到缓存后,不立即关闭,等待下次需要打开时,直接使用即可。为了不消耗过多内存和影响系统其他应用运行,句柄数量不宜过多,通常可以设置为缓存文件总数的10%以内。此值不受系统ulimit的影响,但是会占用系统文件打开数量。

Sendfile

此功能为商业版功能

从v0.4.7开始,可以在文件类型的缓存策略中设置开启Sendfile选项,来有效提升发送缓存文件的效率。开启后,节点将会在合适的时机使用系统sendfile指令发送文件,减少内存拷贝。

使用客户端缓存

可以在缓存条件中,设置”客户端过期时间”: Cache-Expire.png 启用后,可以自动生成Expires Header,客户端浏览器识别后会自动将内容缓存在客户端,下次访问时无需发送请求到服务器即可获取内容,节省了服务器的流量。

客户端缓存缺点是无法在服务器端直接刷新缓存,如果想要缓存失效,通常需要通过修改URL链接的方式。

使用过时缓存

此功能为商业版功能

从v0.3.7以后,可以在缓存设置中”设置”–“更多选项”–“过时缓存策略”中启用过时缓存,启用后,当源站无法访问时就可以使用已过时(已过期)的缓存: Cache-Stale1.png

其中:

  • 有效期 - 缓存在过期之后,仍然保留一段时间不会被删除,用于在源站出错时使用;
  • 状态码 - 通常的状态码可以为500502、503504`等;如果不设置,则包含这些常见的状态码;
  • 支持stale-if-error - 选中后,源站的发送的响应的Header中可以通过Cache-Control设置过时缓存的有效期;如果一个URL不允许使用过时缓存,就可以设置:Cache-Control: stale-if-error=0

注意:开启过时缓存后,意味着缓存会被保留更长的时间,会占用更多的空间。

清除缓存

通过管理界面清除缓存

可以在服务”设置” – “缓存” – “清理”功能中清理一组URL对应缓存: Cache-Purge1.png

通常是每行一个URL。如果你在缓存条件中修改了Key的生成方式,也需要在这里做出对应的修改。

“根据前缀”的选项让我们可以轻松删除一组带有同样前缀的缓存URL: Cache-Purge2.png 这样以下URL缓存都会被自动清理:

https://example.com/book/1.html
https://example.com/book/2.html
https://example.com/book/3.html
https://example.com/book/4.html
...
https://example.com/book/xxx.html

通过PURGE方法清除单个缓存

v0.3.3以后,可以通过PURGE方法清除单个URL对应的缓存:

  1. 先在服务”设置” – “缓存”设置里选中”允许PURGE”,然后手工填入PURGE Key或者留空保存后自动生成;
  2. 使用PURGE方法请求你要清除缓存的URL,并加入X-Edge-Purge-Key Header,值为步骤1中生成的PURGE Key
    PURGE https://example.com/index.html HTTP/1.1
    X-Edge-Purge-Key: ...
    ...
    提交成功后,缓存就会被自动清除。

通过API批量清除缓存

v0.3.3以后,要想通过API清除缓存,需要:

  1. 设置API节点支持REST方式调用:API节点设置
  2. 获取访问令牌

然后调用API节点的 /ServerService/PurgeServerCache 在Header中加入获取到的令牌:

POST http://192.168.1.100/ServerService/PurgeServerCache HTTP/1.1
X-Edge-Access-Token: hGyDUHo9CiszUaTxf... THIS IS ACCESS TOKEN ...
Content-Type: application/json
...

然后在内容中传递对应参数即可:

下面是使用Key清理示例:

{
  "domains": [
	"cdn.teaos.cn"
  ],
  "keys": [
	"https://cdn.teaos.cn/html/hello.html",
	"https://cdn.teaos.cn/images/world.jpg"
  ],
  "prefixes": []
}

下面是使用前缀清理示例:

{
  "domains": [
	"cdn.teaos.cn"
  ],
  "keys": [],
  "prefixes": [
    "https://cdn.teaos.cn/html/",
    "https://cdn.teaos.cn/images/"
  ]
}

其中:

  • domains - 为要清除缓存的服务的域名列表
  • keys - 要清除的缓存的Key,默认是完整的URL,和prefixes二选一
  • prefixes - 要清除的缓存的Key前缀,和keys二选一

如果你有多个API节点,需要在每个API节点都调用这个API。

L2节点缓存

从v0.4.7开始,如果边缘节点查找不到本地缓存时,可以使用L2节点回源,具体请参考L2节点

常见问题

开启缓存后,网站中表单无法正常提交怎么回事?

可能你在配置缓存的时候,把提交表单的URL也设置成了匹配条件,所以被认为是可以缓存的,从而不会把提交的数据转发到源站。你可以:

  1. 在缓存条件设置中排除这个URL;
  2. 在缓存条件设置中,点击”更多选项”,填入请求方法限制,可以限制请求方法为HEAD和GET,这样通过POST方法提交的表单就不会被缓存干扰。

开启缓存后,节点上没有任何缓存文件生成

可以先查看节点日志,检查是否有报错信息;如果没有报错信息,通常没有缓存文件或者缓存内存使用的原因是还没有用户访问此节点上的网站,你可以模拟访问此节点上的网站进行测试。