Nginx lua-nginx-module,openresty,lua基礎語法 筆記

Nginx lua-nginx-module,openresty,lua基礎語法 筆記

1.Lua 用[[…]]括起來的字元不會被轉義,在寫正規表示式的時候很實用;

例:[[^\d .\d $]]

2.lua 中”~=”表示不等於

3.可以用 type(aa)檢視變數 aa 的型別

4.lua 中 0 是真(true)

5.字串連線符:..

7.lua 中的邏輯運算子比較特殊
例:local y = a and b or c 相當於 a?b:c

參考:https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/operator.html

8.local m,n = “aaa” 表示 m 被賦值為字串,n 沒有被賦值,是 nil

9.lua function 可以返回多個值

參考:https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/function_result.html

10.lua 中當 table 作為一個函式的引數時,就和 java 中的集合和陣列一樣是傳引用的方式,而不是傳值的方式

注:java 中都是值傳遞,只不過集合和陣列傳的是物件的地址值

11. 請求頭引數修改方法:ngx.req.set_header(header_name, header_value);
請求體是 table 型別的,所以要修改請求體,可以先 ngx.req.get_body_data,修改完再 ngx.req.set_body_data

table 修改方法:table.key = newvalue 或 table[key] = newvalue

12.Nginx Http 處理流程有:init/rewrite/access/content/filter/log 等

可參考:http://tengine.taobao.org/book/chapter_12.html(多階段處理請求)

13.在 lua 裡判斷空字串只能用檢查長度的方式

14.正則匹配,ngx.re.match()返回的結果是一個表,裡面儲存了匹配的結果,如果匹配成功,
m[0]儲存的是整個(匹配成功的)字串,之後的 m[1],m[2]等儲存的是匹配的子表示式
local m = ngx.re.match(“abcd-123”, “(.*)123$”, “jo”)

— 引數 “j” 啟用 JIT 編譯,引數 “o” 是開啟快取必須的

15. 單行註釋:–

多行註釋:–[[…]]

16.print(#’openresty’) –計算字串長度,輸出 9

17.這些檔案 I/O 操作,在 OpenResty 的上下文中對事件迴圈是會產生阻塞效應。OpenResty 比較擅長的是高併發網路處理,在這個環境中,任何檔案的操作,都將阻塞其他並行執行的請求。實際中的應用,在 OpenResty 專案中應儘可能讓網路處理部分、檔案 I/0 操作部分相互獨立,不要揉和在一起。

https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/file.html

18.官方建議使用 openresty,不建議使用原生 nginx 自己整合 lua-nginx-module

原文:https://github.com/openresty/lua-nginx-module#installation

19.任何重寫規則的第一部分都是一個正規表示式
可以使用括號來捕獲,後續可以根據位置來將其引用,位置變數值取決於捕獲正規表示式中的順序,$1引用第一個括號中的值,$2引用第二個括號中的值,以此類推。
例:^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$
$1是兩個小寫字母組成的字串,$2是由小寫字母和0到9的數字組成的5個字元的字串,$3將是個檔名,$4是png、jpg、gif中的其中一個。
參考:http://www.ttlsa.com/nginx/nginx-rewriting-rules-guide/

20.nginx lua指令及其執行順序

其中上圖中提到的各個指令的作用:

init_by_lua*:初始化 nginx 和預載入 lua(nginx 啟動和 reload 時執行)
init_worker_by_lua*:每個工作程序(worker_processes)被建立時執行,用於啟動一些定時任務,
比如心跳檢查,後端服務的健康檢查,定時拉取伺服器配置等;
ssl_certificate_by_lua*:對 https 請求的處理,即將啟動下游 SSL(https)連線的 SSL 握手時執行,用例:按照每個請求設定 SSL 證書鏈和相應的私鑰,按照 SSL 協議有選擇的拒絕請求等;
set_by_lua*:設定 nginx 變數
rewrite_by_lua*:重寫請求(從原生 nginx 的 rewrite 階段進入),執行內部 URL 重寫或者外部重定向,典型的如偽靜態化的 URL 重寫;
access_by_lua*:處理請求(和 rewrite_by_lua 可以實現相同的功能,從原生 nginx 的 access階段進入)
content_by_lua*:執行業務邏輯併產生響應,類似於 jsp 中的 servlet
balancer_by_lua*:負載均衡
header_filter_by_lua*:處理響應頭
body_filter_by_lua*:處理響應體
log_by_lua*:記錄訪問日誌
參考:https://github.com/openresty/lua-nginx-module
http://tengine.taobao.org/book/chapter_12.html#id8
http://jinnianshilongnian.iteye.com/blog/2186448

21.http請求報文

22.HTTP響應報文

23.附openresty的Github地址https://github.com/openresty