ngx_http_keyval_module动态键值管理

一、模块安装与验证

  1. 检查模块是否可用

    nginx -V 2>&1 | grep --color -o ngx_http_keyval_module
    
    • 如果看到 ngx_http_keyval_module,说明模块已编译进 NGINX。

    • 若未找到,请联系你的 NGINX 供应商,获取商业版或重新编译并启用该模块:

      ./configure --add-module=/path/to/ngx_http_keyval_module
      make && make install
      
  2. 创建持久化目录
    如果打算使用 state 持久化文件,先创建目录并设置权限:

    sudo mkdir -p /var/lib/nginx/state
    sudo chown nginx:nginx /var/lib/nginx/state
    

二、基础配置示例

将以下配置段加入到你的 nginx.conf(或包含在 http { ... } 块内):

# 1. 定义共享内存区 “one”,大小 32k,状态文件持久化到 /var/lib/nginx/state/one.keyval
keyval_zone zone=one:32k state=/var/lib/nginx/state/one.keyval;# 2. 定义查表规则:用请求参数 arg_text 作为“键”,查到的“值”放入 $text 变量
keyval $arg_text $text zone=one;server {listen 80;server_name example.com;# 3. 普通访问:直接返回 $text 的内容location / {# 如果没查到,$text 为空,返回空白return 200 $text;}# 4. API 端点:允许 POST/DELETE 操作来增删键值对location /api {api write=on;}
}

说明:

  • keyval_zone:声明共享内存,zone=name:size;可选 state=path 持久化;
  • keyval:定义查表,key 为输入变量,$variable 为输出变量;
  • location /api { api write=on; }:开启 HTTP API 管理。

三、部署与测试

1. 语法检查并重载

sudo nginx -t && sudo systemctl reload nginx
  • nginx -t:检查配置是否有语法错误。
  • reload:平滑重载,使新配置生效,无需重启服务。

2. 通过 API 写入键值对

  • 请求方式POST /api

  • 请求头Content-Type: application/json

  • 请求体示例

    {"key": "hello","value": "world"
    }
    
  • curl 命令:

    curl -X POST http://example.com/api \-H "Content-Type: application/json" \-d '{"key":"hello","value":"world"}'
    
  • 响应:HTTP 204 No Content 表示写入成功。

3. 验证查表结果

  • 访问GET /?text=hello

  • 期望返回world

  • curl 测试:

    curl "http://example.com/?arg_text=hello"
    

    如果看到 world,说明查表成功。

4. 删除键值对

  • 请求方式DELETE /api

  • 请求体示例

    { "key": "hello" }
    
  • curl 命令:

    curl -X DELETE http://example.com/api \-H "Content-Type: application/json" \-d '{"key":"hello"}'
    
  • 再次访问 /?arg_text=hello,返回空字符串,说明已删除。

四、进阶配置与场景

1. IP 白名单与灰度发布

配置
# 16k 内存,IP 类型索引,1 小时后过期,开启同步
keyval_zone zone=gray:16k type=ip timeout=1h sync state=/var/lib/nginx/state/gray.keyval;
# 客户端 IP 作为查表键,结果写入 $gray_flag
keyval $remote_addr $gray_flag zone=gray;
操作流程
  1. 加入灰度(1 小时内有效):

    curl -X POST http://example.com/api \-H "Content-Type: application/json" \-d '{"key":"192.168.1.0/24","value":"on"}'
    
  2. 业务配置

    location /new-feature {if ($gray_flag = "on") {proxy_pass http://new_backend;}return 403;  # 其他用户禁止访问
    }
    
  3. 过期自动删除:1 小时后,192.168.1.0/24 会被移除,无需手动干预。

2. 前缀匹配做 A/B 测试

配置
# 前缀匹配,24 小时过期
keyval_zone zone=ab:32k type=prefix timeout=24h state=/var/lib/nginx/state/ab.keyval;
keyval $arg_userid $bucket zone=ab;
操作流程
  1. 划分流量

    # 前缀 "A" 组
    curl -X POST http://example.com/api \-H "Content-Type: application/json" \-d '{"key":"A","value":"blue"}'
    # 前缀 "B" 组
    curl -X POST http://example.com/api \-H "Content-Type: application/json" \-d '{"key":"B","value":"green"}'
    
  2. 路由逻辑

    location / {if ($bucket = "blue") {proxy_pass http://blue_backend;}if ($bucket = "green") {proxy_pass http://green_backend;}# 默认回退proxy_pass http://default_backend;
    }
    

五、参数详解汇总

指令参数含义
keyval_zonezone=name:size共享内存区名称和大小(如 one:32k
state=path持久化 JSON 文件路径
timeout=duration键值对自动过期时间(如 1h24h
`type=stringipprefix`索引类型
- string:精确匹配
- ip:CIDR/IP 匹配
- prefix:前缀匹配
sync开启多节点删除同步(需配合 timeout
keyvalkey用于查表的 NGINX 变量(如 $arg_text$remote_addr
$variable存储查表结果的变量名(如 $text$gray_flag
zone=name指定共享内存区名称

六、常见问题与排查

  1. 写入后未生效

    • 检查 /api 是否正确启用 write=on
    • 查看 NGINX error 日志:sudo tail -n50 /var/log/nginx/error.log
  2. state 文件损坏

    • 若手动编辑产生语法错误,可临时移除或重命名,让模块重建:

      mv /var/lib/nginx/state/one.keyval /var/lib/nginx/state/one.keyval.bak
      sudo systemctl reload nginx
      
  3. 内存不足报错

    • 增大 keyval_zonesize,如 64k128k,保证索引空间充足。

七、结语

通过以上零基础、逐步演示,你已掌握:

  • 模块安装验证
  • 基础配置与 API 操作
  • 灰度发布、A/B 测试等实战场景
  • 参数详解与常见问题排查

借助 ngx_http_keyval_module,你可以在不重启 NGINX 的前提下,轻松实现动态路由功能开关访问控制等需求,大幅提升运维与业务迭代效率。祝你上手顺利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

upload-labs通关笔记-第4关 文件上传之.htacess绕过

目录 一、.htacess 二、代码审计 三、php ts版本安装 1、下载ts版本php 2、放入到phpstudy指定文件夹中 3、修改php配置文件 4、修改php.ini文件 5、修改httpd.conf文件 (1)定位文件 (2)修改文件 6、重启小皮 7、切换…

LeetCode 88. 合并两个有序数组 | Python 最简写法 + 实战注释

在日常刷题和面试中,「合并两个有序数组」是一个经典基础题。虽然属于简单难度,但它非常考察你的数组操作技巧和代码优化能力。本篇文章将带你从基础解法入手,进阶到最简洁的三元表达式写法,理解每一行代码背后的逻辑。 📌 题目描述 给你两个按 非递减顺序 排列的整数数组…

Kafka进阶指南:从原理到实战

目录 一、Kafka 基础回顾 二、生产者进阶 2.1 数据生产流程深度解析 2.2 关键配置参数详解 2.3 序列化与自定义序列化器 三、消费者进阶 3.1 消费方式与原理 3.2 分区分配策略 3.2.1 Range(范围)策略 3.2.2 Round - Robin(轮询&…

Lightpanda开源浏览器:专为 AI 和自动化而设计的无界面浏览器

​一、软件介绍 文末提供程序和源码下载 Lightpanda开源浏览器:专为 AI 和自动化而设计的无界面浏览器; Javascript execution Javascript 执行Support of Web APIs (partial, WIP)支持 Web API(部分、WIP)Compatible with Pla…

团结引擎开源车模 Sample 发布:光照渲染优化 动态交互全面体验升级

光照、材质与交互效果的精细控制,通常意味着复杂的技术挑战,但借助 Shader Graph 14.1.0(已内置在团结引擎官方 1.5.0 版本中),这一切都变得简单易用。通过最新团结引擎官方车模 Sample,开发者能切身感受到全新光照优化与编辑功能…

SpringCloud之Ribbon基础认识-服务负载均衡

0、Ribbon基本认识 Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端 负载均衡的工具。 Ribbon 主要功能是提供客户端负载均衡算法和服务调用 Ribbon 客户端组件提供一系列完善的配置项如连接超时,重试等。 Ribbon 会基于某种规则(如简单…

当 DeepSeek 遇见区块链:一场颠覆式的应用革命

目录 一、DeepSeek 与区块链的初印象二、技术融合:创新的基石2.1 强化学习优化智能合约2.2 混合专家系统适配多链2.3 语义理解增强合规性 三、应用实践:重塑行业格局3.1 DeFi 协议智能化跃迁3.2 GameFi 经济深度进化3.3 供应链金融信任增强 四、面临挑战…

vue3项目中使用CodeMirror组件的详细教程,中文帮助文档,使用手册

简介 这是基于 Vue 3 开发的 CodeMirror 组件。该组件基于 CodeMirror 5 开发,仅支持 Vue 3。 除了支持官方提供的各种语法模式外,还额外添加了日志输出展示模式,开箱即用,但不一定适用于所有场景。 如需完整文档和更多使用案例…

LeetCode热题100--240.搜索二维矩阵--中等

1. 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[1…

2025爬虫实战技巧:高效数据采集方案

2025爬虫实战技巧:高效数据采集方案 🔥 本文核心价值 HTTPS请求链路加密逆向解析动态Cookie生成机制破解Cloudflare等高级防护绕过方案分布式爬虫架构设计要点目录 2025爬虫实战技巧:高效数据采集方案🔥 本文核心价值一、现代反爬机制技术解析1.1 主流平台防护体系1.2 反…

绑定 SSH key(macos)

在 macOS 上绑定 Gitee 或 GitHub 的 SSH Key,通常分为以下几步操作,包括生成 SSH key、添加到 ssh-agent,并配置到 Gitee 或 GitHub 平台。 1. 检查是否已有 SSH Key ls -al ~/.ssh 看看是否已有 id_rsa 或 id_ed25519 等文件。如果没有就…

Tailwind CSS v4 主题化实践入门(自定义 Theme + 主题模式切换)✨

ok,经过学习Tailwindcss我决定将此专栏建设成为一个Tailwindcss实战专栏,我将在专栏内完成5050挑战:50天50个Tailwindcss练习项目,欢迎大家订阅!!! Tailwind CSS v4 带来了更强大的主题定制能力…

SAF利用由Varjo和AFormX开发的VR/XR模拟器推动作战训练

通过将AFormX的先进军用飞行模拟器与Varjo的行业领先的VR/XR硬件相结合,斯洛文尼亚武装部队正以经济高效、沉浸式的训练方式培训战斗机飞行员,以提高其战术准备和作战效率。 挑战:获得战术军事航空训练的机会有限 军事航空训练长期以来一直…

VUE中通过DOM导出PDF

最终效果 前端导出PDF的核心在于样式的绘制上,这里其实直接使用CSS进行绘制和布局就行,只不过需要计算好每页DIV盒子的大小,防止一页放不下造成样式错乱。 项目依赖 项目是Vue3 TS npm i html2canvas1.4.1 npm i jspdf3.0.1工具类(htmlToPdf…

SpringAI框架中的RAG模块详解及应用示例

SpringAI框架中的RAG模块详解及应用示例 RAG(Retrieval-Augmented Generation)可以通过检索知识库,克服大模型训练完成后参数冻结的局限性,携带知识让大模型根据知识进行回答。SpringAI框架提供了模块化的API来支持RAG&#xff0…

MySQL-数据查询(测试)-05-(12-1)

1-数据准备: CREATE TABLE 员工信息表 (员工编号 VARCHAR(10) PRIMARY KEY,姓名 VARCHAR(20),学历 VARCHAR(20),出生日期 DATE,性别 INT,工作年限 INT,地址 VARCHAR(100),电话号码 VARCHAR(20),员工部门号 INT ); INSERT INTO 员工信息表 (员工编号, 姓名, 学历, 出…

5G网络:能源管理的“智能电网“革命,Python如何成为关键推手?

5G网络:能源管理的"智能电网"革命,Python如何成为关键推手? 大家好,我是Echo_Wish。今天咱们聊一个既硬核又接地气的话题——5G网络如何用Python代码重构全球能源管理。 不知道你们有没有注意过: • 家里装了智能电表后,电费突然变"聪明"了,谷时充…

AI背景下,如何重构你的产品?

当AI敲门时,你的产品准备好开门了吗? 最近和做产品的老张聊天,他愁眉苦脸地说:"现在AI这么火,我们的产品就像个老古董,用户都跑隔壁用AI产品去了。“这话让我想起三年前另一个朋友,当时区…

互联网大厂Java面试实战:从Spring Boot到微服务的技术问答与解析

💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…

Apollo学习——aem问题

执行aem指令出现一下问题 lxflxf:~/MYFile/apollo_v10.0 $aem enter permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.49/containers/json?filters%7B%22name%22%…