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 协议》,转载必须注明作者和本文链接