当前位置: 首页 > article >正文

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 的前提下,轻松实现动态路由功能开关访问控制等需求,大幅提升运维与业务迭代效率。祝你上手顺利!

相关文章:

ngx_http_keyval_module动态键值管理

一、模块安装与验证 检查模块是否可用 nginx -V 2>&1 | grep --color -o ngx_http_keyval_module如果看到 ngx_http_keyval_module,说明模块已编译进 NGINX。 若未找到,请联系你的 NGINX 供应商,获取商业版或重新编译并启用该模块&am…...

【高频面试题】LRU缓存

文章目录 1 相关前置知识(OS)2 面试题 16.25. LRU 缓存2.1 题面2.2 示例2.3 解法1 (双端队列哈希表)思路 2.4 解法2思路 3 参考 1 相关前置知识(OS) 为什么需要页面置换算法:当进程运行时&…...

讯联云库项目开发日志(二)AOP参数拦截

目录 利用AOP实现参数拦截: 一、​​HTTP请求进入Controller​(发送邮件验证码) 二、AOP切面触发 1. 切面拦截(GlobalOperactionAspect.class) method.getAnnotation()​​ null interceptor 判断​​ 2.参数校验注解 3. 参…...

龙虎榜——20250515

上证指数缩量收阴线,个股跌多涨少,上涨波段4月9日以来已有24个交易日,时间周期上处于上涨末端,注意风险。 深证指数缩量收阴线,日线上涨结束的概率在增大,注意风险。 2025年5月15日龙虎榜行业方向分析 一…...

知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑

1. 搜索引擎的进化论 从雅虎目录式搜索到Google的PageRank算法,搜索引擎经历了三次技术跃迁。而AI搜索引擎正在掀起第四次革命:在电商场景中,传统的「关键词匹配」已无法满足个性化购物需求,MOE搜索等新一代架构开始融合知识图谱…...

python-修改图片背景色

在Python中,可以使用图像处理库(如OpenCV或Pillow)来修改图片的背景色。通常,修改背景色的流程包括以下步骤: 1、对图片进行分割,识别前景和背景。 2、对背景区域进行颜色替换。 下面是两种实现方法&#x…...

卡洛诗,将高端西餐的冗余价值转化为普惠体验

西餐市场正经历一场结构性变革,一二线城市的高端西餐陷入内卷,而下沉市场却因品质与价格断层陷入选择困境——消费者既不愿为高价西餐的面子溢价买单,又难以忍受快餐式西餐的粗糙体验。这一矛盾催生了万亿级的市场真空地带,萨莉亚…...

【ROS2】ROS节点启动崩溃:rclcpp::exceptions::RCLInvalidArgument

1、问题描述 启动ROS节点时,直接崩溃,打印信息如下: terminate called after throwing an instance of rclcpp::exceptions::RCLInvalidArgumentwhat(): failed to create guard condition: context argument is null, at ./src/rcl/guard_condition.c:65 [ros2run]: Abo…...

Flutter在键盘的上方加一个完成按钮

有些情况下,输入框在输入键盘弹出后, 需要在键盘的上方显示一个toolbar , 然后 toolbar 上面一个完成按钮,点完成按钮把键盘关闭。 如图: 直接上代码,这样写的好处是,把 TextField 给封装了&…...

SQL注入---05--跨站注入

1 权限说明 select * from mysql.user; 这里的Y表示我前面的命令权限为root,n表示不支持root权限 导致结果: 如果为root的话,我就可操作这些命令并且可以进行跨数据库攻击,但是如果不是高权限root就无法执行这些操作 2 root权限…...

Vue 学习随笔系列二十三 -- el-date-picker 组件

el-date-picker 组件 文章目录 el-date-picker 组件el-date-picker 只有某些日期可选 el-date-picker 只有某些日期可选 <template><div><el-form ref"form" size"mini":model"form" :rules"rules"label-width"8…...

【免费分享】虚拟机VM(适用于 Windows)17.6.3

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://drive.uc.cn/s/7c4da5cd2af64 【​本章下载二】&#xff1a;https://pan.xunlei.com/s/VOQDkRRKc5OUVTauZezaiDEHA1?pwdpybg# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…...

Oracle中的select1条、几条、指定范围的语句

在Oracle中&#xff0c;可以使用不同的方法来选择一条记录、多条记录或指定范围内的记录。以下是具体的实现方式&#xff1a; 1. 查询单条记录 使用ROWNUM伪列限制结果为1条&#xff1a; SELECT * FROM your_table WHERE ROWNUM 1;特点&#xff1a;Oracle会在结果集生成时分…...

2025 后端自学UNIAPP【项目实战:旅游项目】5、个人中心页面:微信登录,同意授权,获取用户信息

一、框架以及准备工作 1、前端项目文件结构展示 2、后端项目文件结构展示 3、登录微信公众平台&#xff0c;注册一个个人的程序&#xff0c;获取大appid&#xff08;前端后端都需要&#xff09;和密钥&#xff08;后端需要&#xff09; 微信公众平台微信公众平台&…...

校园网规划与设计方案

一、项目概述 校园网是学校实现信息化教学、科研与管理的重要基础设施,其性能与稳定性直接影响学校的整体发展。随着学校规模不断扩大、教学科研活动日益丰富,对校园网的带宽、可靠性、安全性以及智能化管理等方面提出了更高要求。本规划与设计方案旨在构建一个高速、稳定、…...

蓝桥杯算法题 -蛇形矩阵(方向向量)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 P…...

配置VScodePython环境Python was not found;

Python was not found; run without arguments to install from the Microsoft Store, or disable this shortcut from Settings > Manage App Execution Aliases. 候试试重启电脑。 在卸载重装python后会出现难以解决的局面&#xff0c;系统变量&#xff0c;命令行&#…...

ollama 重命名模型

ollama 重命名模型 ollama list# 查看列表 ollama list # 生成原模型的Modelfile文件 ollama show --modelfile qwen3:32b > Modelfile # 从Modelfile文件创建新的模型 ollama create qwen3 -f Modelfile # 删除原模型 ollama rm qwen3:32b...

Qt信号槽机制与UI设计完全指南:从基础原理到实战应用

目录 前言一、信号槽1.1 传参1.2 Qt信号与槽的对应关系1.2.1一对多关系1.2.2 多对一关系 二、Designer三、Layout 布局3.1 基础用法3.2 打破布局3.3 贴合窗口3.4 伸展器&#xff08;Spacer&#xff09;3.5 嵌套布局 四、ui指针五、QWidget六、QLabel 标签使用指南总结 前言 本…...

Anaconda环境中conda与pip命令的区别

文章目录 conda与pip的基本区别在Anaconda环境中的实际差异安装包环境管理依赖解决示例最佳实践建议 常见问题解答 conda与pip的基本区别 包来源与生态系统 conda&#xff1a;从Anaconda默认仓库或conda-forge等渠道获取包 不仅管理Python包&#xff0c;还能管理非Python依赖&…...

XBL6501/02/03在POE设备上的应用方案

前言&#xff1a; 在当今数字化时代&#xff0c;POE&#xff08;Power over Ethernet&#xff09;设备因其能够通过以太网线同时传输数据和电力而被广泛应用。为了满足这些设备日益增长的电源需求&#xff0c;芯伯乐推出了XBL6501/02/03系列DC-DC电源芯片&#xff0c;为POE设备…...

编程题 03-树2 List Leaves【PAT】

文章目录 题目输入格式输出格式输入样例输出样例 题解解题思路完整代码 编程练习题目集目录 题目 Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. 输入格式 Each input file contains one test case. For each case, …...

生信小白学Rust-03

语句和表达式 举个栗子&#x1f330; fn add_with_extra(x: i32, y: i32) -> i32 {let x x 1; // 语句let y y 5; // 语句x y // 表达式 } // 语句执行操作 // 表达式会返回一个值 怎么区分呢&#xff0c;目前我的理解是只要返回了值&#xff0c;那它就是表达式 fn…...

缺乏需求优先级划分时,如何合理分配资源?

当需求优先级不明确时&#xff0c;合理分配资源的关键在于建立统一评估标准、实施敏捷资源管理、提升团队协作效率、加强跨部门沟通机制。尤其是建立统一评估标准至关重要&#xff0c;它能帮助组织快速判断各项需求的重要性与紧迫性&#xff0c;从而实现资源的动态匹配与有效利…...

操作系统学习笔记第3章 内存管理(灰灰题库)

1. 单选题 某页式存储管理系统中&#xff0c;主存为 128KB&#xff0c;分成 32 块&#xff0c;块号为 0、1、2、3、…、31。某作业有 5 块&#xff0c;其页号为 0、1、2、3、4&#xff0c;被分别装入主存的 3、8、4、6、9 块中。有一逻辑地址为 [3, 70]&#xff08;其中方括号中…...

详细分析python 中的deque 以及和list 的用法区别

dqque :双端队列&#xff0c;可以快速的从另外一侧追加和推出对象,deque是一个双向链表&#xff0c;针对list连续的数据结构插入和删除进行优化。它提供了两端都可以操作的序列&#xff0c;这表示在序列的前后你都可以执行添加或删除操作。 通过上图可以看出&#xff0c;deque …...

Stack overflow

本文来源 &#xff1a;腾讯元宝 Stack Overflow - Where Developers Learn, Share, & Build Careers 开发者学习&#xff0c;分享 通过学习、工作和经验积累等方式&#xff0c;逐步建立和发展自己的职业生涯。 Find answers to your technical questions and help othe…...

和为target问题汇总

文章目录 习题377.组合总和 IV494.目标和 和为target的问题&#xff0c;可以有很多种问题的形式的考察&#xff0c;当然&#xff0c;及时的总结与回顾有利于我们熟练掌握这些知识&#xff01; 习题 377.组合总和 IV 377.组合总和 IV 思路分析&#xff1a;通过观察&#xff0…...

STM32单片机内存分配详细讲解

单片机的内存无非就两种&#xff0c;内部FLASH和SRAM&#xff0c;最多再加上一个外部的FLASH拓展。在这里我以STM32F103C8T6为例子讲解FLASH和SRAM。 STM32F103C8T6具有64KB的闪存和20KB的SRAM。 一. Flash 1.1 定义 非易失性存储器&#xff0c;即使在断电后&#xff0c;其所…...

RedHat7 如何更换yum镜像源

RedHat7如何更换yum镜像源&#xff1f; # 删除系统自带 yum rpm -qa|grep -e yum -e python-urlgrabber |xargs rpm -e --nodeps# 下载yum与wget的rpm软件包 curl -O http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-168.el7.centos.noarch.rpm curl -O ht…...