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.pswp.cn/web/79921.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79921.shtml
英文地址,請注明出處:http://en.pswp.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%…