功能说明
proxy-cache 插件提供了根据缓存键缓存响应的功能。该插件支持基于磁盘和基于内存的缓存选项,用于缓存 GET、POST 和 HEAD 请求。
可以根据请求 HTTP 方法、响应状态代码、请求头值等有条件地缓存响应。
配置字段
| 名称 | 类型 | 填写要求 | 默认值 | 有效值 | 描述 |
|---|---|---|---|---|---|
| cache_strategy | string | 可选 | disk | ["disk","memory"] | 缓存策略。缓存在磁盘还是内存中。 |
| cache_zone | string | 可选 | disk_cache_one | ["disk_cache_one","memory_cache"] | 与缓存策略一起使用的缓存区域。该值应与缓存策略相对应。例如,当使用内存缓存策略 memory 时,应该使用内存缓存区域 memory_cache。 |
| cache_key | array[string] | 可选 | ["$host", "$request_uri"] | 缓存 key,可以使用变量。例如:["$host", "$uri", "-cache-id"]。 | |
| cache_bypass | array[string] | 可选 | 当该属性的值不为空或者非 0 时则会跳过缓存检查,即不在缓存中查找数据,可以使用变量,例如:["$arg_bypass"]。 | ||
| cache_method | array[string] | 可选 | ["GET", "HEAD"] | ["GET", "POST", "HEAD"] | 根据请求 method 决定是否需要缓存。 |
| cache_http_status | array[integer] | 可选 | [200, 301, 404] | [200,599] | 根据 HTTP 响应码决定是否需要缓存。 |
| hide_cache_headers | boolean | 可选 | false | 当设置为 true 时将 Expires 和 Cache-Control 响应头返回给客户端。 | |
| cache_control | boolean | 可选 | false | 当设置为 true 时遵守 HTTP 协议规范中的 Cache-Control 的行为。 | |
| no_cache | array[string] | 可选 | 当此参数的值不为空或非 0 时将不会缓存数据,可以使用变量。 | ||
| cache_ttl | integer | 可选 | 300s | cache_ttl>=1 | 当选项 cache_control 未开启或开启以后服务端没有返回缓存控制头时,提供的默认缓存时间。 |
配置示例
在磁盘上缓存数据
磁盘缓存策略具有系统重启时数据持久性以及与内存缓存相比具有更大存储容量的优势。它适用于优先考虑耐用性且可以容忍稍大的缓存访问延迟的应用程序。
使用磁盘缓存策略时,缓存 TTL 由响应标头 Expires 或 Cache-Control 中的值确定。如果这些标头均不存在,或者 网关 由于上游不可用而返回 502 Bad Gateway 或 504 Gateway Timeout,则缓存 TTL 默认为 10 秒。
以下示例演示了如何在路由上使用 proxy-cache 插件将数据缓存在磁盘上:
cache_strategy: disk
cache_zone: disk_cache_one在在线调试中请求对应的路由或者接口。
如果返回 200 HTTP 状态码,并且响应头中包含 Agw-Cache-Status 字段,则表示该插件已启用。如果你是第一次请求该路由,数据未缓存,那么 Agw-Cache-Status 字段应为 MISS。
HTTP/1.1 200 OK
···
Agw-Cache-Status: MISS此时再次请求该路由,如果返回的响应头中 Agw-Cache-Status 字段变为 HIT,则表示数据已被缓存,插件生效。
HTTP/1.1 200 OK
···
Agw-Cache-Status: HIT等待缓存在 TTL 之后过期,再次发送相同的请求。您应该看到带有以下标头的 HTTP/1.1 200 OK 响应,表明缓存已过期:
HTTP/1.1 200 OK
···
Agw-Cache-Status: EXPIRED在内存中缓存数据
内存缓存策略具有低延迟访问缓存数据的优势,因为从 RAM 检索数据比从磁盘存储检索数据更快。它还适用于存储不需要长期保存的临时数据,从而可以高效缓存频繁更改的数据。
以下示例演示了如何在路由上使用 proxy-cache 插件在内存中缓存数据。
cache_strategy: memory
cache_zone: memory_cache
cache_ttl: 10
有条件地缓存响应
以下示例演示了如何配置 proxy-cache 插件以有条件地缓存响应。
使用 proxy-cache 插件创建路由并配置 no_cache 属性,这样如果 URL 参数 no_cache 和标头 no_cache 的值中至少有一个不为空且不等于 0,则不会缓存响应:
no_cache: ["$arg_no_cache", "$http_no_cache"]向路由发送一些请求,其中 URL 参数的 no_cache 值表示绕过缓存:
curl -i "http://127.0.0.1:27151/anything?no_cache=1"您应该收到所有请求的 HTTP/1.1 200 OK 响应,并且每次都观察到以下标头:
Agw-Cache-Status: EXPIRED向路由发送一些其他请求,其中 URL 参数 no_cache 值为零:
curl -i "http://127.0.0.1:27151/anything?no_cache=0"您应该收到所有请求的 HTTP/1.1 200 OK 响应,并开始看到缓存被命中:
Agw-Cache-Status: HIT您还可以在 no_cache 标头中指定以下值:
curl -i "http://127.0.0.1:27151/anything" -H "no_cache: 1"响应不应该被缓存:
Agw-Cache-Status: EXPIRED有条件地从缓存中检索响应
以下示例演示了如何配置 proxy-cache 插件以有条件地从缓存中检索响应。
使用 proxy-cache 插件创建路由并配置 cache_bypass 属性,这样如果 URL 参数 bypass 和标头 bypass 的值中至少有一个不为空且不等于 0,则不会从缓存中检索响应:
cache_bypass: ["$arg_bypass", "$http_bypass"]向路由发送一个请求,其中 URL 参数值为 bypass,表示绕过缓存:
curl -i "http://127.0.0.1:27151/anything?bypass=1"您应该看到带有以下标头的 HTTP/1.1 200 OK 响应:
Agw-Cache-Status: BYPASS向路由发送另一个请求,其中 URL 参数 bypass 值为零:
curl -i "http://127.0.0.1:27151/anything?bypass=0"您应该看到带有以下标头的 HTTP/1.1 200 OK 响应:
Agw-Cache-Status: MISS您还可以在 bypass 标头中指定以下值:
curl -i "http://127.0.0.1:27151/anything" -H "bypass: 1"响应应该显示绕过缓存:
Agw-Cache-Status: BYPASS
配置模板
# [可选]缓存策略,缓存在磁盘还是内存中。disk或者memory,默认disk。
cache_strategy: disk
# [可选]cache_strategy为disk时,填disk_cache_one;为memory时,填memory_cache。
cache_zone: disk_cache_one
# [可选]缓存key,可以使用变量,类型为数组。默认为["$host","$request_uri"]
cache_key: ["$uri", "-cache-id"]
# [可选]是否跳过缓存检索,即不在缓存中查找数据,可以使用变量,当此参数的值不为空时将会跳过缓存的检索,类型为数组。
#cache_bypass: ["$arg_bypass"]
# [可选]根据请求method决定是否需要缓存,类型为数组。method可选["GET", "POST", "HEAD"],默认为["GET", "HEAD"]
cache_method: ["GET", "POST", "HEAD"]
# [可选]根据响应码决定是否需要缓存,,类型为数组。支持范围[200,599],默认为[200, 301, 404]
cache_http_statu: [200, 301, 404]
# [可选]是否将Expires和Cache-Control响应头返回给客户端,默认为false
#hide_cache_header: false
# [可选]是否遵守HTTP协议规范中的Cache-Control的行为,默认为false
#cache_control: false
# [可选]是否缓存数据,可以使用变量,当此参数的值不为空时将不会缓存数据,类型为数组。
#no_cache: ["$arg_no_cache"]
# [可选]当选项cache_control未开启或开启以后服务端没有返回缓存控制头时,提供缓存时间,默认300秒
cache_ttl: 300