当前位置:首页 > AI技术 > 正文内容

开发讲Nginx中map令现根据变量动态设置缓存时长最佳践|Duuu笔记

admin2个月前 (04-05)AI技术54

前端进阶技巧:本文深入解析

map指令用于Nginx中基于请求特征动态生成缓存时长变量,通过键值映射实现条件化赋值,配合proxy_cache_valid等指令达成精细化缓存控制。

map 指令是 Nginx 中实现“条件化变量赋值”的核心工具,它本身不直接控制缓存,但能基于请求特征(如 URL、Header、参数)生成自定义变量,再配合

proxy_cache_valid

expires

实现精细化缓存时长控制——这才是动态缓存的关键所在。

map 的本质:用键值映射生成新变量

map 不是 if,不能嵌套或写复杂逻辑,它的作用非常纯粹:根据一个源变量的值,查表匹配出目标变量的值。所有匹配必须在 server 块外(通常放在 http 块中)定义,且只支持字符串精确匹配或正则匹配。

例如,想对 API 接口和静态资源设置不同缓存时间:

http {

# 定义缓存时长变量 $cache_ttl

map $request_uri $cache_ttl {

default "10m"; # 默认 10 分钟

~*^/api/v1/users/ "5s"; # 用户接口仅缓存 5 秒

~*^/static/ "1h"; # 静态资源缓存 1 小时

~*\.(js|css|png|jpg)$ "1d"; # 资源文件缓存 1 天

}

server {

location / {

proxy_pass http://backend;

proxy_cache my_cache;

proxy_cache_valid 200 302 $cache_ttl; # 关键:这里引用动态变量

}

}

}

自由画布

百度文库和百度网盘联合开发的AI创作工具类智能体

下载

结合请求头或 Cookie 实现用户级缓存策略

比如对登录用户返回的内容不缓存,未登录用户可缓存更久。这时可借助

$cookie_user_id

$http_authorization

判断身份:

map $cookie_user_id $cache_ttl_for_user {

"" "30m"; # 无 cookie,视为游客,缓存 30 分钟

default "0s"; # 有 user_id,不缓存(等价于禁用)

}

map $http_authorization $cache_ttl_by_auth {

"" "1h";

default "0s";

}

注意:

"0s"

proxy_cache_valid

中表示“不缓存该响应”,不是“缓存 0 秒”;若要彻底跳过缓存,还可加

proxy_cache_bypass $cache_ttl_for_user;

配合使用。

避免常见陷阱:匹配顺序、默认值与正则细节

map 匹配按书写顺序从上到下,遇到第一个匹配即停止,所以正则要放 default 上方,否则永远走不到

正则匹配自动忽略大小写(

~*

),但需注意转义特殊字符,如

^/api\/v1\/

default 必须存在,否则未匹配时变量为空,可能导致

proxy_cache_valid

解析失败或回退为默认行为

map 变量只能用于指令上下文支持变量的地方,像

proxy_cache_valid

支持,但

proxy_cache_path

不支持

验证与调试技巧

动态缓存是否生效,不能只看配置,要实际验证响应头:

curl -I

查看

X-Cache

Cache-Control

头是否符合预期

在 log_format 中加入

$cache_ttl

,通过 access_log 确认每次请求匹配的值

临时加

add_header X-Cache-TTL $cache_ttl;

直观观察变量取值

Nginx reload 后,用

nginx -t

检查语法,map 错误常导致 reload 失败且提示模糊

相关文章

【深度学习】Java DL4J 2024年度技术总结

一、Java DL4J深度学习概述 1.1 DL4J框架简介 1.2 与其他深度学习框架的比较 1.3 DL4J 的优势 1.3.1 与 Java 生态系统的无...

【大数据分析 | 深度学习】在Hadoop上实现分布式深度学习

一、Submarine(Hadoop生态系统) (一)Submarine 介绍 (三)Submarine 属于 Hadoop 生态系统 (四)Submarine 官网版...

LLM介绍

。LLM 被证明在使用指令形式化描述的未见过的任务上表现良好。这意味着 LLM 能够根据任务指令执行任务,而无需事先见过具体示例,展示了其强大的泛化能力。 :小型语言模型通常难以解决涉...

一文讲清神经网络、BP神经网络、深度学习的关系

人工神经网络中的顶级代表。往往说《神经网络》就是指《BP神经网络》。 大家研究着各种神经网络,研究得不亦乐乎, 来了两个家伙Romelhart 和Mcclelland,...

深入理解优化:如何利用 Gemini 3.1 的阶梯计费策略?企业级大规模调用实务完全指南|Duuu笔记

需深入理解Gemini 3.1阶梯计费与调用联动关系,通过识别阶梯区间、请求级Token预估截断、多模型路由调度、响应缓存去重、项目拆分配额绑定五种路径优化成本。 ☞☞☞AI 智能聊天, 问答助手,...

前端开发实战详解:骡子快跑怎么注册账号 骡子快跑账号注册流程最佳实践|Duuu笔记

骡子快跑注册仅需1分钟,但激活码需从Discord指定频道获取,输错3次将锁账户24小时;积分与注册邮箱强绑定且不可更换;部分地区即使注册成功也无法运行Agent。 ☞☞☞AI 智能聊天, 问答助手...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。