ngx_http_keyval_module动态键值管理

news2025/5/16 10:21:49

一、模块安装与验证

  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.coloradmin.cn/o/2376772.html

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

相关文章

【高频面试题】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日龙虎榜行业方向分析 一…

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

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

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

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

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

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

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

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

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

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

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

🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 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后会出现难以解决的局面,系统变量,命令行&#…

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 伸展器(Spacer)3.5 嵌套布局 四、ui指针五、QWidget六、QLabel 标签使用指南总结 前言 本…

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

前言: 在当今数字化时代,POE(Power over Ethernet)设备因其能够通过以太网线同时传输数据和电力而被广泛应用。为了满足这些设备日益增长的电源需求,芯伯乐推出了XBL6501/02/03系列DC-DC电源芯片,为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

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

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

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

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

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

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

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

Stack overflow

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

和为target问题汇总

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