摘要:對于需要進一步注意的是參數的使用,可以傳入所定義的所有的狀態碼常量如等和兩個模塊內核常量只支持和這兩個,如果傳入其他的如等則進程住。
序
本文主要解讀下nginx lua module的主要方法和api。
ngx_lua運行階段 initialization phaseinit_by_lua
用在http模塊,常用于全局變量的申請
init_worker_by_lua
在每個nginx worker進程啟動時調用指定的lua代碼rewrite / access phase
set_by_lua:
設置一個變量,計算變量供后續使用
rewrite_by_lua
可替代HttpRewriteModule的rewrite指令來使用的,優先級低于rewrite指令
access_by_lua
可以用來修改請求參數content phase
content_by_lua
由ngx返回內容,而不走proxied后端
header_filter_by_lua
可以用來修改后端response的header
body_filter_by_lua
一般會在一次請求中被調用多次, 因為這是實現基于 HTTP 1.1 chunked 編碼的所謂“流式輸出”的。log phase
log_by_lua
在請求結束的時候運行,可以做些統計工作nginx api for lua ngx.cookie_time
ngx.cookie_time(ngx.time() + 60 * 30) -- 設置Cookie過期時間為30分鐘ngx.ctx
當前請求的上下文ngx.decode_args
decode為table
local decoded_uri=ngx.decode_args("arg1=day1&arg2= monday"); print_t(decoded_uri); function print_t(t) for k, v in pairs(t) do if type(v) == table then ngx.say(k, ": ", table.concat(v), "ngx.encode_args
"); else ngx.say(k, ": ", v, "
"); end end end
將table編碼為表單提交格式,a1=arg1&a2=arg2
ngx.say("encode args ", ngx.encode_args({a1="arg1", a2="arg2"}), "ngx.eof
");
標識response結束,ngx.eof()只是結束響應流的輸出,中斷HTTP連接,后面的代碼邏輯還會繼續在服務端執行
ngx.req.read_body() local uri_args = ngx.req.get_uri_args(1) ngx.say(cjson.encode{result="refuse"}) ngx.eof()ngx.escape_uri
uri編碼
local fileName = "專輯列表.csv" ngx.header.content_type = "text/csv;charset=utf-8" ngx.header["Content-disposition"] = "attachment;filename=" .. ngx.escape_uri(fileName)ngx.exec
內部重定向
location /foo { content_by_lua " return ngx.exec("/some-location", "a=3&b=5&c=6"); "; }ngx.exit
當傳入的status >= 200(200即為ngx.HTTP_OK),ngx.exit() 會中斷當前請求,并將傳入的狀態碼(status)返回給nginx。當傳入的status == 0(0即為ngx.OK)則 ngx.exit() 會中斷當前執行的phrase(ngx-lua模塊處理請求的階段,如content_by_lua*),進而繼續執行下面的phrase。
對于 ngx.exit() 需要進一步注意的是參數status的使用,status可以傳入ngx-lua所定義的所有的HTTP狀態碼常量(如:ngx.HTTP_OK、ngx.HTTP_GONE、ngx.HTTP_INTERNAL_SERVER_ERROR等)和兩個ngx-lua模塊內核常量(只支持NGX_OK和NGX_ERROR這兩個,如果傳入其他的如ngx.AGAIN等則進程hang住)。
文檔中推薦的 ngx.exit() 最佳實踐是同 return 語句組合使用,目的在于增強請求被終止的語義(return ngx.exit(...))。
if not ngx.var.arg_token then ngx.log(ngx.ERR, "Unauthorized") return ngx.exit(ngx.HTTP_UNAUTHORIZED) end
配合使用return,增強退出語義,防止出錯ngx.flush
ngx.say("Hello, Lua!") ngx.flush(true)
設置為true的話,則ngx.print或者ngx.say的內容等寫入send buffer之后才返回ngx.get_phase
返回當前的處理階段,init, init_worker,ngx.http_time
ssl_cert, set, rewrite, balancer, access, content, header_filter, body_filter, log, or
timer這幾個之一
ngx.header["Content-Type"] = "application/json; charset=utf-8"; ngx.header["Expires"] = ngx.http_time( ngx.time() + max_age ); ngx.say(ngx.http_time(1290079655)) -- yields "Thu, 18 Nov 2010 11:27:35 GMT"ngx.is_subrequest
如果是subrequest則返回truengx.localtime
從NGINX"s cache中返回yyyy-mm-dd hh:mm:ss格式的時間ngx.location.capture
用于子請求,返回: status, header, body, and truncated (a Boolean to represent if the body is truncated).ngx.log
第一個參數是log基本(one of ngx.STDERR, ngx.EMERG, ngx.ALERT,ngx.CRIT, ngx.ERR, ngx.WARN, ngx.NOTICE, ngx.INFO, and ngx.DEBUG)ngx.now
后續可以接多個參數來打印log
從NGINX"s cache返回epoch time以來的毫秒數
ngx.now() 是有誤差的,因為使用了nginx 自身的時間緩存。對于精度要求較高的計時,應使用下面的調用序列:
ngx.update_time() local now = ngx.now()
值得一提的是,ngx.now() 只有毫秒精度。
ngx.parse_http_timelocal time = ngx.parse_http_time("Thu, 18 Nov 2010 11:27:35 GMT") if time == nil then ... endngx.print
打印到response body.ngx.say
打印到response body并換行ngx.status
http status狀態碼ngx.time
從nginx cached返回epoch time以來的秒數(no syscall involved unlike Lua"s date library).ngx.today
從NGINX"s cache返回當前日期,格式 yyyy-mm-ddngx.unescape_uri
ngx.say(ngx.unescape_uri("b%20r56+7")) -- 返回b r56 7ngx.update_time
更新NGINX"s time cachengx.utctime
從NGINX"s cache返回UTC time,格式yyyy-mm-dd hh:mm:ssdoc
nginx基本配置與參數說明
nginx配置文件說明
nginx與lua的執行順序和步驟說明
ngx_lua用例說明
ngx_lua 模塊
lua-nginx-module模塊里ngx_lua的所有指令以及可用ngx所有方法
由一條OpenResty Error log談談ngx.exit與ngx.eof的區別
ngx_Lua模塊中的重定向
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/39747.html
摘要:例如響應部分通過的形式獲取或設置響應頭信息。以某個狀態碼返回響應內容,狀態碼常量對應關系見部分,也支持數字形式的狀態碼。重定向當前請求到新的,響應狀態碼可選列表為默認。具體內容如下相關文章進入的世界在的應用 首發于 樊浩柏科學院 當 Nginx 標準模塊和配置不能靈活地適應系統要求時,就可以考慮使用 Lua 擴展和定制 Nginx 服務。OpenResty 集成了大量精良的 Lua 庫...
摘要:例如設置響應狀態碼并退出注意,設置狀態碼僅在響應頭發送前有效,并且該函數調用之后該函數后面的將被忽略掉,因為已經了。 一、介紹 二、安裝 三、運行 四、開發 1. 介紹 Tengine:輕量級、高性能、高并發、配置化、模塊化、可擴展、可移植的Web和反向代理 服務器,Tengine是nginx超集,但做了很多優化,包含了很多比較有用的模塊,比如直接包含了lua、proc等很...
摘要:例如設置響應狀態碼并退出注意,設置狀態碼僅在響應頭發送前有效,并且該函數調用之后該函數后面的將被忽略掉,因為已經了。 一、介紹 二、安裝 三、運行 四、開發 1. 介紹 Tengine:輕量級、高性能、高并發、配置化、模塊化、可擴展、可移植的Web和反向代理 服務器,Tengine是nginx超集,但做了很多優化,包含了很多比較有用的模塊,比如直接包含了lua、proc等很...
摘要:異常與默認值為默認值為秒。實驗請求里頭的會發起一個,請求請求一次對逐個請求,都失敗,則的返回,對返回的取決于腳本再請求一次該下面的都掛的情況下出現中健康檢查機制深入分析容錯機制原創胡志廣線上的一次分析 異常 upstream server temporarily disabled while connecting to upstream no live upstreams while...
摘要:深度學習篇一動靜分離通過中間件將動態請求和靜態請求進行分離。原因分離資源,減少不必要的請求消耗,減少請求延時。關閉后,重定向會失效。驗證規則保持一致。啟動,也會要求你輸入密碼。根據用戶的信息等信息區別根據用戶的地址實現灰度發布示意圖 Nginx-深度學習篇 一、動靜分離 通過中間件將動態請求和靜態請求進行分離。原因:分離資源,減少不必要的請求消耗,減少請求延時。 動態和靜態請求圖例:s...
閱讀 2676·2023-04-25 18:10
閱讀 1617·2019-08-30 15:53
閱讀 2811·2019-08-30 13:10
閱讀 3228·2019-08-29 18:40
閱讀 1134·2019-08-23 18:31
閱讀 1209·2019-08-23 16:49
閱讀 3408·2019-08-23 16:07
閱讀 883·2019-08-23 15:27