天天看點

關于openresty lua使用的一些tips

轉 https://qinguan.github.io/2018/04/12/some-tips-about-openresty-lua/

關于openresty lua使用的一些tips 

nginx 是多 worker 程序的模型,是以除了共享記憶體字典是所有 worker 程序共享之外,其他的資料都是每 worker 一份的,無論是在 init_by_lua 裡面建立的全局變量,還是 Lua 子產品裡的狀态變量。

在某個請求裡面更新某個 Lua 變量,隻是更新了目前處理這個請求的 nginx worker 程序裡的狀态,并不會影響其他的 worker 程序(除非隻配置了一個 nginx worker)。

Lua VM 是每一個 nginx worker 程序一份。這些獨立的 Lua VM 副本是從 nginx master 程序的

Lua VM 給 fork 出來的。而 init_by_lua 運作在 master 程序的 Lua VM 中,時間點發生在程序 fork

之前。

在共享記憶體字典中儲存最新的資料,每個 worker 程序裡通過 Lua 子產品變量或者 init_by_lua 建立的全局變量<code>追蹤</code>目前 worker 裡實際使用的資料(worker需要不斷同共享記憶體的資料進行比較并更新)。

關于上述1、2、3、4點,更多請參考:

google group-init_by_lua中全局變量的用法

google group-worker内多個請求共享全局變量

lua_code_cache的使用

關閉lua_code_cache, 則每一個請求都由一個獨立的lua VM來處理。是以,通過A請求變更的lua資料(如子產品變量),不會被B請求解析到,即使隻配置了一個。

關閉lua_code_cache的好處,對于純lua檔案(不涉及nginx解析的),在不重新開機nginx的情況下也能立即生效。

啟用lua_code_cache, 則同一個worker的所有請求共享一個lua VM的資料。是以,由該worker處理的A請求變更了lua資料(如子產品變量),則會被同一個worker處理的B請求通路到。

生産環境強烈建議啟用lua_code_cache,否則會帶來較大的性能損失。

更多參考 這裡

關于lua變量共享問題

盡量不使用全局變量

如果要使用,使用子產品變量

如果子產品變量無法滿足,使用共享記憶體或者分布式緩存

更多參考 lua-variable-scope、變量的共享範圍

Data Sharing within an Nginx Worker

data-sharing-in-openresty

不應使用子產品級的局部變量以及子產品屬性,存放任何請求級的資料。否則在 luacodecache 開啟時,會造成請求間互相影響和資料競争,産生不可預知的異常狀況。

關于 OPENRESTY 的兩三事