openresty函數說明

安裝luajit

wget http://luajit.org/download/LuaJIT-2.1.0-beta1.tar.gz
tar -xvf LuaJIT-2.1.0-beta1.tar.gz
cd LuaJIT-2.1.0-beta1
make && make install

安裝openresty

wget https://openresty.org/download/ngx_openresty-1.7.10.1.tar.gz
tar -zxxvf ngx_openresty-1.7.10.1.tar.gz 
cd ngx_openresty-1.7.10.1
./configure --prefix=/usr/local/openresty
gmake&&gmake install

平滑升級

wget https://openresty.org/download/openresty-1.13.6.1.tar.gz
tar -zxvf openresty-1.13.6.1.tar.gz
cd openresty-1.13.6.1
./configure --prefix=/usr/local/openresty
make
mv /usr/local/openresty/nginx/sbin/nginx /usr/local/openresty/nginx/sbin/nginx.old
cp build/nginx-1.13.6/objs/nginx /usr/local/openresty/nginx/sbin/nginx
kill -USR2 `cat /home/lua/nginx.pid`
kill -QUIT `cat /home/lua/nginx.pid.oldbin`
/usr/local/openresty/nginx/sbin/nginx -t
/usr/local/openresty/nginx/sbin/nginx -v
/usr/local/openresty/nginx/sbin/nginx -s reload

nginx執行過程

nginx在處理每個用戶請求時,都是按照若干個不一樣的階段依次處理的,與配置文件上的順序沒有關係,詳細內容能夠閱讀《深刻理解nginx:模塊開發與架構解析》這本書,這裏只作簡單介紹;html

一、post-readnginx

讀取請求內容階段,nginx讀取並解析完請求頭以後就當即開始運行;git

二、server-rewritegithub

server請求地址重寫階段;緩存

三、find-configbash

配置查找階段,用來完成當前請求與location配重塊之間的配對工做;架構

四、rewrite併發

location請求地址重寫階段,當ngx_rewrite指令用於location中,就是再這個階段運行的;運維

五、post-rewrite異步

請求地址重寫提交階段,當nginx完成rewrite階段所要求的內部跳轉動做,若是rewrite階段有這個要求的話;

六、preaccess

訪問權限檢查準備階段,ngx_limit_req和ngx_limit_zone在這個階段運行,ngx_limit_req能夠控制請求的訪問頻率,ngx_limit_zone能夠控制訪問的併發度;

七、access

權限檢查階段,ngx_access在這個階段運行,配置指令可能是執行訪問控制相關的任務,如檢查用戶的訪問權限,檢查用戶的來源IP是否合法;

八、post-access

訪問權限檢查提交階段;

九、try-files

配置項try_files處理階段;

十、content

內容產生階段,是全部請求處理階段中最爲重要的階段,由於這個階段的指令一般是用來生成HTTP響應內容的;

十一、log

日誌模塊處理階段;

 

經常使用函數或語句

# 設置純 Lua 擴展庫的搜尋路徑(';;' 是默認路徑):
 lua_package_path '/foo/bar/?.lua;/blah/?.lua;;';

 # 設置 C 編寫的 Lua 擴展模塊的搜尋路徑(也能夠用 ';;'):
 lua_package_cpath '/bar/baz/?.so;/blah/blah/?.so;;';

access_by_lua_file lua腳本文件; 准入階段完成參數驗證

content_by_lua_block{書寫lua腳本區域}; 內容產生階段的lua腳本

client_body_in_file_only on;強制請求body到臨時文件中

lua_code_cache off;//lua腳本緩存關閉   生產環境務必要設置成on

internal;標記只能內部使用,即由ngx.location.capture或ngx.location.capture_multi調用

ngx.req請求內容

ngx.ctx 用於保存每一個請求的上下文,數據共享;;;注意開銷較大(本人未驗證https://moonbingbing.gitbooks.io/openresty-best-practices/content/openresty/share_var.html)

ngx.var.request_method請求方法

ngx.var.remote_addr客戶端ip

nginx.log(日誌級別, 參數。。。)生成日誌

ngx.STDERR     -- 標準輸出
 ngx.EMERG      -- 緊急報錯
 ngx.ALERT      -- 報警
 ngx.CRIT       -- 嚴重,系統故障,觸發運維告警系統
 ngx.ERR        -- 錯誤,業務不可恢復性錯誤
 ngx.WARN       -- 告警,業務中可忽略錯誤
 ngx.NOTICE     -- 提醒,業務比較重要信息
 ngx.INFO       -- 信息,業務瑣碎日誌信息,包含不一樣狀況判斷等
 ngx.DEBUG      -- 調試

ngx.now()當前時間戳

ngx.say()異步輸出 比print會多輸出一個\n

ngx.print()異步輸出

ngx.flush()顯式的向客戶端輸出響應

ngx.sleep(s)暫停S秒

ngx.req.get_headers()獲取請求頭信息

ngx.req.get_body_file()獲取上傳的文件

ngx.req.get_uri_args()獲取uri參數

ngx.req.read_body()讀取body

ngx.req.get_body_data()獲取符合http協議的請求體,不是普通的字符串。

須要指定lua_need_request_body on;指令

ngx.req.get_body_file()獲取請求body的臨時文件內容

ngx.req.get_post_args()獲取post請求參數,必定要先執行ngx.req.read_body()

ngx.req.start_time()請求開始時間

ngx.encode_agrs()對請求參數進行轉義即其餘語言的urlencode

ngx.location.capture(location, {參數體})調用其餘location  一個同步非阻塞的NGINX子請求uri

ngx.location.capture_multi({

{location1,{參數體1}},

{location2,{參數體2}},

})並行調用兩個location

ngx.exec() 主要實現的是內部的重定向,等價於rewrite指令 ; 該方法不會主動返回,所以,強烈建議在調用該方法時,最好顯式加上return

nginx.redirect(url)該方法會給客戶端返回一個301/302重定向,具體是301仍是302取決於設定的status值,若是不指定status值,默認是返回302 .

ngx.exit()退出

 

一些坑

1.content_by_lua_block openresty 1.7.10.1不可用,視乎是在1.9.x開始支持

2.content_by_lua_file path  path若是使用相對路徑是啓動時-p參數指定的根路徑不然默認是nginx安裝路徑做爲根路徑

3.Nginx內核規定一次能夠發起的子請求的個數不能超過50個

4.只有當lua_code_cache設置爲on時鏈接池才生效。

 

 

 

 

 

中文文檔:https://github.com/iresty/nginx-lua-module-zh-wiki

OpenResty 最佳實踐  

https://www.gitbook.com/book/moonbingbing/openresty-best-practices/details

關於 OpenResty 的兩三事

http://zivn.me/2013/08/05/something-about-openresty/

wiki:https://www.openresty.com.cn/nginx-lua-module-zh-wiki.html

相關文章
相關標籤/搜索