1、 安裝
准備主要的三個安裝包,分別是
nginx-1.15.9.tar.gz
LuaJIT-2.0.5.tar.gz
lua-nginx-module-0.10.14.tar.gz
相關版本可以去官網下載,放在自定義目錄並解壓:
先安裝LuaJIT:
下面需要配置一下LuaJIT的環境變量,編譯nginx時需要。
再將nginx和lua-nginx-module一起編譯,先執行configure,
然后make
然后install:
啟動nginx:
報錯了,執行如下操作:
執行完后,啟動成功。
2、常用邏輯
1)直接返回
2)獲取url參數
3)獲取request body
4)子請求轉發
ngx.location.capture:是一個同步非阻塞的nginx子請求uri,nginx的子請求提供了一個非常強大的方式去實現非阻塞的內部請求,這些子請求僅僅是模擬HTTP請求,但是並沒有額外的HTTP/TCP,它只能請求到相對於當前nginx服務器的路徑,不能使用絕對路徑進行訪問。
5)POST請求修改消息體
3、常用指令介紹
lua_code_cache:
設置是否緩存lua file的代碼,默認是on,即開啟緩存,生產環境強烈建議開啟緩存,否則會大大影響性能,但是自己開發調試時候可以關閉緩存,這樣不需要reload nginx也可以是代碼生效。
在調用過一次后,修改賦值內容為test_content_file_1,不需重啟nginx,可以看到返回值不一樣。
lua_package_path:設置 set_by_lua*,content_by_lua* 和 其他腳本對 Lua 模塊的查找路徑。路徑字符串是標准 Lua 路徑格式,特殊標識 ;; 可被用來代表原始搜索路徑。
lua_package_cpath:設置 set_by_lua*,content_by_lua* 和其他腳本對 Lua C 模塊的查找路徑。 cpath 路徑字符串是標准 Luacpath 路徑格式,特殊標識;; 可被用來代表原始 cpath 路徑。
init_by_lua_block:當Nginx master進程加載Nginx配置文件時,在全局的Lua虛擬機上運行<lua-script-str>指定的Lua代碼。通常,我們可以在服務啟動時注冊Lua全局變量或預加載Lua模塊。
init_by_lua_file:把上面的處理部分轉到lua文件,並且指定文件路徑,其他的一樣。
set_by_lua_block:將處理結果返回到預定義入參,該指令被設計為執行短小、快速的代碼塊,因為代碼執行時Nginx的事件循環是被阻塞的,因此應避免耗時的代碼處理。
set_by_lua_file:已文件方式使用上述說明。
content_by_lua_block:
為每個請求執行<lua script str>中指定的lua代碼,Lua代碼可以進行API調用,並在獨立的全局環境中作為新生成的協程執行,不要在同一位置使用此指令和其他內容處理程序指令。例如,此指令和proxy-pass指令不應在同一位置使用。
舉例見上面常用邏輯里的圖。
content_by_lua_file:以文件方式使用content_by_lua。
rewrite_by_lua_block:作為一個rewrite階段的處理程序,為每個請求執行由<lua-script-str>指定的Lua代碼。這些Lua代碼可以調用全部 API,並作為一個新的協程,在一個獨立的全局環境中執行,注意這個處理過程總是在標准ngx_http_rewrite_module的后面。
重寫URL:
rewrite_by_lua_file:rewrite_by_lua的文件表示。
access_by_lua_block:access階段處理,對每次請求執行在<lua-script-str>中指名的Lua代碼,這些Lua代碼可以調用 全部 API,並作為一個新的協程,在一個獨立的全局環境中執行,本指令的處理總是在標准ngx_http_access_module的后面,access_by_lua不能運行在子請求中。
如果child返回200,則:
修改child轉發的url,轉發到不存在的地址:
access_by_lua_file:access_by_lua的文件表示。
header_filter_by_lua_block:用<lua-script-str>中指名的lua代碼,來完成應答消息頭部的過濾。
header_filter_by_lua_file:header_filter_by_lua的文件表示。
body_filter_by_lua_block:使用<lua-script-str>指定的Lua代碼定義一個輸出應答體過濾器。輸入數據塊是ngx.arg[1](Lua的字符串形式),結束標識"eof"是應答體數據最后一位ngx.arg[2](Lua的布爾值形式)。
body_filter_by_lua_file:body_filter_by_lua的文件表示。
balancer_by_lua_block:該指令執行上游的負載均衡Lua代碼,代碼配置在upstream {}小節中。Lua 負載均衡能完全忽略配置在upstream {}小節中定義的服務列表,並且從一個完全動態的服務列表中挑選一個節點,所有這些均是通過lua-resty-core庫的ngx.balancer完成。
在8080,8081分別啟動相同的服務,通過傳入的index完成服務端選擇:
balancer_by_lua_file:balancer_by_lua_block的文件表示。
有人翻譯了lua-nginx-module,地址如下:
https://github.com/iresty/nginx-lua-module-zh-wiki#ssl_certificate_by_lua_block