nginx 使用ctx實現資料共享,修改上下文

2022-03-07 17:28:10 字數 1737 閱讀 7116

環境: init_worker_by_lua, set_by_lua, rewrite_by_lua, access_by_lua, content_by_lua, header_filter_by_lua, body_filter_by_lua, log_by_lua, ngx.timer., balancer_by_lua

這個 lua 表可以用來儲存基於請求的 lua 環境資料,其生存週期與當前請求相同 (類似 nginx 變數)。

參考下面例子,

location /test 

access_by_lua_block

content_by_lua_block

}

訪問 get /test 輸出

79也就是說,ngx.ctx.foo 條目跨越乙個請求的 rewrite (重寫),access (訪問),和 content (內容) 各處理階段保持一致。

每個請求,包括子請求,都有乙份自己的 ngx.ctx 表。例如:

location /sub 

} location /main

}

訪問 get /main 輸出

main pre: 73

sub pre: nil

sub post: 32

main post: 73

這裡,在子請求中修改 ngx.ctx.blah 條目並不影響父請求中的同名條目,因為它們各自維護不同版本的 ngx.ctx.blah。

內部重定向將摧毀原始請求中的 ngx.ctx 資料 (如果有),新請求將會有乙個空白的 ngx.ctx 表。例如,

location /new 

} location /orig

}

訪問 get /orig 將輸出

nil而不是原始的 "hello" 值。

任意資料值,包括 lua 閉包與巢狀表,都可以被插入這個「魔法」表,也允許註冊自定義元方法。

也可以將 ngx.ctx 覆蓋為乙個新 lua 表,例如,

ngx.ctx =

當用在 init_worker_by_lua* 環境中,這個表與當前 lua 控制代碼生命週期相同。

ngx.ctx 表查詢需要相對昂貴的元方法呼叫,這比通過使用者自己的函式引數直接傳遞基於請求的資料要慢得多。所以不要為了節約使用者函式引數而濫用此 api,因為它可能對效能有明顯影響。

而且由於元方法「魔法」,不要在 lua 模組級別試圖使用 "local" 級別的 ngx.ctx ,例如 worker-level data sharing。下面示例是糟糕的:

-- mymodule.lua

local _m = {}

-- 下面一行的 ngx.ctx 是屬於單個請求的,但ctx變數是在 lua 模組級別

-- 並且屬於單個 worker 的。

local ctx = ngx.ctx

function _m.main()

ctx.foo = "bar"

endreturn _m

應使用下面方式替代:

-- mymodule.lua

local _m = {}

function _m.main(ctx)

ctx.foo = "bar"

endreturn _m

就是說,呼叫者對 ctx 表呼叫應通過函式傳參方式完成。

nginx利用ctx實現資料共享 修改上下文功能

環境 init worker by lua,set by lua,rewrite by lua,access by lua,content by lua,header filter by lua,body filter by lua,log by lua,ngx.timer.balancer by ...

使用Nginx實現限流

1.http限流配置 限制請求 請求單個ip,每秒讀50次,寫10次 limit req zone uri zone api read 20m rate 50r s 讀 limit req zone uri zone api write 20m rate 10r s 寫 按ip配置乙個連線 zone...

使用Nginx實現負載均衡

一 nginx 簡介nginx 是乙個高效能的http 伺服器和反向 伺服器。它起初是俄羅斯人igor sysoev 開發的,至今支撐者俄羅斯的很多大型的 二 nginx 支援的三種負載均衡策略 輪詢 將請求依次輪詢發給每個伺服器。ip雜湊 通過雜湊函式決定請求傳送給哪個伺服器。權重 伺服器的權重越...