openresty 与 proxy_cache 配合控制哪些请求被缓存

nginx 配置:

# 定义一个存储缓存的空间
# 上下文 http
proxy_cache_path /usr/local/openresty/nginx/cache  levels=1:2  keys_zone=my_cache:10m  max_size=1g inactive=60m use_temp_path=off;
location / {
  set $ctl_proxy_cache_no_use 1;
  access_by_lua_file '/usr/local/openresty/nginx/waf/lua/on_access.lua';

  proxy_pass http://backend;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_ignore_client_abort on;

  # proxy_cache 配置
  proxy_cache my_cache;
  # proxy_cache_key $host$uri;
  proxy_ignore_headers Set-Cookie;
  proxy_cache_methods GET HEAD;

  proxy_cache_valid 200 304 1d;
  add_header Nginx-Cache-Status  "$upstream_cache_status";
  proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
  proxy_cache_lock on;
  proxy_cache_background_update on;

  # 控制的关键两行
  proxy_no_cache $ctl_proxy_cache_no_use;
  proxy_cache_bypass $ctl_proxy_cache_no_use;

  log_by_lua_file '/usr/local/openresty/nginx/waf/lua/on_log.lua';
}

proxy_no_cache 当值不为0或不为空时,将不被缓存
proxy_cache_bypass 当值不为0或不为空时,将不从缓存中读取

为了使用 lua 脚本控制哪些请求被缓存、哪些不被缓存,先初始化一个变量 $ctl_proxy_cache_no_use,上方设置值为 1,代表默认都不缓存,通过在 nginx 的 on_access 阶段,动态的修改变量的值便达到了目的。

我们假设只 a.com b.com 的首页被缓存,其他不缓存,而且当 cookie 中存在 example_key 时不缓存。

-- on_access.lua
local url  = ngx.var.host .. ngx.var.uri
local urls_pattern = [=[^(a|b)\.com\/$]=]
if  ngx.re.find(url, urls_pattern, "isjo") then
 return
end

local example_key = ngx.var["cookie_example_key"]
if example_key then return end

-- 修改 nginx 变量
ngx.var.ctl_proxy_cache_no_use = 0;
本作品采用《CC 协议》,转载必须注明作者和本文链接
welcome come back
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
98
粉丝
25
喜欢
159
收藏
359
排名:316
访问:3.0 万
私信
所有博文
社区赞助商