經過lua擴展nginx

一、 安裝nginx

準備主要的三個安裝包,分別是git

nginx-1.15.9.tar.gzgithub

LuaJIT-2.0.5.tar.gz緩存

lua-nginx-module-0.10.14.tar.gz服務器

相關版本能夠去官網下載,放在自定義目錄並解壓:負載均衡

先安裝LuaJIT性能

下面須要配置一下LuaJIT的環境變量,編譯nginx時須要。lua

再將nginxlua-nginx-module一塊兒編譯,先執行configureurl

而後makespa

 

而後install

 

啓動nginx

報錯了,執行以下操做:

執行完後,啓動成功。

二、經常使用邏輯

1)直接返回

2)獲取url參數

 

3)獲取request body

 

4)子請求轉發

ngx.location.capture:是一個同步非阻塞的nginx子請求uringinx的子請求提供了一個很是強大的方式去實現非阻塞的內部請求,這些子請求僅僅是模擬HTTP請求,可是並無額外的HTTP/TCP,它只能請求到相對於當前nginx服務器的路徑,不能使用絕對路徑進行訪問。

 

5POST請求修改消息體

三、經常使用指令介紹

 

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_blockNginx 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_filerewrite_by_lua的文件表示。

access_by_lua_blockaccess階段處理,對每次請求執行在<lua-script-str>中指名的Lua代碼,這些Lua代碼能夠調用 所有 API,並做爲一個新的協程,在一個獨立的全局環境中執行,本指令的處理老是在標準ngx_http_access_module的後面,access_by_lua不能運行在子請求中。

 

若是child返回200,則:

修改child轉發的url,轉發到不存在的地址:

 

access_by_lua_fileaccess_by_lua的文件表示。

header_filter_by_lua_block<lua-script-str>中指名的lua代碼,來完成應答消息頭部的過濾。

 

header_filter_by_lua_fileheader_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_filebody_filter_by_lua的文件表示。

balancer_by_lua_block該指令執行上游的負載均衡Lua代碼,代碼配置在upstream {}小節中。Lua 負載均衡能徹底忽略配置在upstream {}小節中定義的服務列表,而且從一個徹底動態的服務列表中挑選一個節點,全部這些均是經過lua-resty-core庫的ngx.balancer完成。

8080,8081分別啓動相同的服務,經過傳入的index完成服務端選擇:

balancer_by_lua_filebalancer_by_lua_block的文件表示。

 

有人翻譯了lua-nginx-module,地址以下:

https://github.com/iresty/nginx-lua-module-zh-wiki#ssl_certificate_by_lua_block

相關文章
相關標籤/搜索