Nginx 1.31.5 发布:location 可以根据变量选路由了
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
Nginx 的配置有个特点:需求简单时,几行就能解决;一旦碰上灰度发布、租户隔离、请求头分流, 配置能跑,但隔几个月再回来维护,往往要先把匹配顺序重新捋一遍。Nginx 1.31.5 新增的 predicate location,解决的正是这类配置不够顺手的问题。 这个版本于 2026 年 9 月 2 日发布。现在的 ![]() 新增能力不是动态路径“location 支持变量”这句话容易产生歧义。它并不是允许把变量直接拼进 URI 路径: nginx # 这不是 1.31.5 新增的用法 location /api/$tenant/ { proxy_pass http://backend; } 1.31.5 新增的是谓词 nginx location $use_canary { proxy_pass http://canary_backend; } 请求到达时,Nginx 会计算 这里没有新增一套条件表达式语法。涉及多个请求头、Cookie、来源地址等条件时,仍然应该先用 nginx # 谓词 location 不支持这种直接比较 location $arg_debug = 1 { return 200 "debug"; } 换句话说,变量负责给出“是”或“否”, 用灰度路由看一遍完整配置假设订单接口同时运行稳定版和灰度版。请求头 nginx http { upstream order_stable { server 10.0.0.11:8080; } upstream order_canary { server 10.0.0.21:8080; } map $http_x_release_channel $use_canary { default 0; canary 1; } server { listen 80; location /api/orders/ { # 灰度请求进入独立的 location location $use_canary { add_header X-Route canary always; proxy_connect_timeout 2s; proxy_read_timeout 15s; proxy_pass http://order_canary; } # 其他请求继续使用稳定版 add_header X-Route stable always; proxy_connect_timeout 2s; proxy_read_timeout 30s; proxy_pass http://order_stable; } } } 以前也能根据变量切换 upstream,所以这项能力的价值不只是“换一个后端地址”。它允许灰度请求进入独立的 如果需求只是根据变量切换 upstream,没有其他策略差异, 还有一个明确的限制:谓词 nginx # 不支持:上游地址后带有 /internal/ location $use_canary { proxy_pass http://order_canary/internal/; } 应该使用不带 URI 的上游地址: nginx location $use_canary { proxy_pass http://order_canary; } 匹配顺序决定请求最终走向谓词 1. 精确匹配 2. 查找最长的前缀 3. 最长前缀没有使用 4. 正则没有命中,再按照配置顺序检查谓词 5. 谓词没有命中,使用之前找到的前缀 因此,正则匹配仍然优先于谓词匹配。最长前缀使用了 同一层还可以配置多个谓词 nginx location $is_emergency { return 503; } location $is_canary { proxy_pass http://canary_backend; } 如果 这部分需要在评审时重点检查。谓词配置的先后顺序不是排版问题,而是实际的业务优先级。 适合切换整套请求处理策略谓词 • 根据请求头或 Cookie 进入灰度服务; • 为不同租户配置独立的限流、缓存和超时; • 根据客户端证书或来源网段应用不同的安全策略; • 维护开关开启后,让部分请求进入降级逻辑; • 配合 1.31.5 的请求体提前读取和 JSON 变量能力,按请求体字段路由。 按请求体路由需要额外说明。Nginx 默认先选择 升级前确认实际使用的 Nginx 版本1.31.5 属于 mainline 主线版本。生产环境准备使用新语法时,首先要确认当前运行的是不是对应版本的原生 Nginx。 OpenResty、Tengine、Ingress Controller 以及各 Linux 发行版的软件包都有自己的版本节奏。官方 Nginx 已经支持,不代表这些产品或软件源中的版本已经同步。 升级后先检查版本和配置,再做平滑重载: bash # 确认实际运行版本 nginx -v # 检查配置语法 nginx -t # 配置检查通过后再平滑重载 nginx -s reload 验证时不能只测试变量为真的情况。变量为空、值为 总结Nginx 1.31.5 没有把 只需要切换 upstream,原有的 这项功能的语法很短,使用时真正需要关注的是变量如何计算、各种 阅读原文:点击这里 该文章在 2026/9/9 11:10:05 编辑过 |
关键字查询
相关文章
正在查询... |