摘要:對(duì)于需要進(jìn)一步注意的是參數(shù)的使用,可以傳入所定義的所有的狀態(tài)碼常量如等和兩個(gè)模塊內(nèi)核常量只支持和這兩個(gè),如果傳入其他的如等則進(jìn)程住。
序
本文主要解讀下nginx lua module的主要方法和api。
ngx_lua運(yùn)行階段 initialization phaseinit_by_lua
用在http模塊,常用于全局變量的申請(qǐng)
init_worker_by_lua
在每個(gè)nginx worker進(jìn)程啟動(dòng)時(shí)調(diào)用指定的lua代碼rewrite / access phase
set_by_lua:
設(shè)置一個(gè)變量,計(jì)算變量供后續(xù)使用
rewrite_by_lua
可替代HttpRewriteModule的rewrite指令來使用的,優(yōu)先級(jí)低于rewrite指令
access_by_lua
可以用來修改請(qǐng)求參數(shù)content phase
content_by_lua
由ngx返回內(nèi)容,而不走proxied后端
header_filter_by_lua
可以用來修改后端response的header
body_filter_by_lua
一般會(huì)在一次請(qǐng)求中被調(diào)用多次, 因?yàn)檫@是實(shí)現(xiàn)基于 HTTP 1.1 chunked 編碼的所謂“流式輸出”的。log phase
log_by_lua
在請(qǐng)求結(jié)束的時(shí)候運(yùn)行,可以做些統(tǒng)計(jì)工作nginx api for lua ngx.cookie_time
ngx.cookie_time(ngx.time() + 60 * 30) -- 設(shè)置Cookie過期時(shí)間為30分鐘ngx.ctx
當(dāng)前請(qǐng)求的上下文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
");
標(biāo)識(shí)response結(jié)束,ngx.eof()只是結(jié)束響應(yīng)流的輸出,中斷HTTP連接,后面的代碼邏輯還會(huì)繼續(xù)在服務(wù)端執(zhí)行
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
內(nèi)部重定向
location /foo { content_by_lua " return ngx.exec("/some-location", "a=3&b=5&c=6"); "; }ngx.exit
當(dāng)傳入的status >= 200(200即為ngx.HTTP_OK),ngx.exit() 會(huì)中斷當(dāng)前請(qǐng)求,并將傳入的狀態(tài)碼(status)返回給nginx。當(dāng)傳入的status == 0(0即為ngx.OK)則 ngx.exit() 會(huì)中斷當(dāng)前執(zhí)行的phrase(ngx-lua模塊處理請(qǐng)求的階段,如content_by_lua*),進(jìn)而繼續(xù)執(zhí)行下面的phrase。
對(duì)于 ngx.exit() 需要進(jìn)一步注意的是參數(shù)status的使用,status可以傳入ngx-lua所定義的所有的HTTP狀態(tài)碼常量(如:ngx.HTTP_OK、ngx.HTTP_GONE、ngx.HTTP_INTERNAL_SERVER_ERROR等)和兩個(gè)ngx-lua模塊內(nèi)核常量(只支持NGX_OK和NGX_ERROR這兩個(gè),如果傳入其他的如ngx.AGAIN等則進(jìn)程hang?。?。
文檔中推薦的 ngx.exit() 最佳實(shí)踐是同 return 語句組合使用,目的在于增強(qiáng)請(qǐng)求被終止的語義(return ngx.exit(...))。
if not ngx.var.arg_token then ngx.log(ngx.ERR, "Unauthorized") return ngx.exit(ngx.HTTP_UNAUTHORIZED) end
配合使用return,增強(qiáng)退出語義,防止出錯(cuò)ngx.flush
ngx.say("Hello, Lua!") ngx.flush(true)
設(shè)置為true的話,則ngx.print或者ngx.say的內(nèi)容等寫入send buffer之后才返回ngx.get_phase
返回當(dāng)前的處理階段,init, init_worker,ngx.http_time
ssl_cert, set, rewrite, balancer, access, content, header_filter, body_filter, log, or
timer這幾個(gè)之一
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格式的時(shí)間ngx.location.capture
用于子請(qǐng)求,返回: status, header, body, and truncated (a Boolean to represent if the body is truncated).ngx.log
第一個(gè)參數(shù)是log基本(one of ngx.STDERR, ngx.EMERG, ngx.ALERT,ngx.CRIT, ngx.ERR, ngx.WARN, ngx.NOTICE, ngx.INFO, and ngx.DEBUG)ngx.now
后續(xù)可以接多個(gè)參數(shù)來打印log
從NGINX"s cache返回epoch time以來的毫秒數(shù)
ngx.now() 是有誤差的,因?yàn)槭褂昧薾ginx 自身的時(shí)間緩存。對(duì)于精度要求較高的計(jì)時(shí),應(yīng)使用下面的調(diào)用序列:
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狀態(tài)碼ngx.time
從nginx cached返回epoch time以來的秒數(shù)(no syscall involved unlike Lua"s date library).ngx.today
從NGINX"s cache返回當(dāng)前日期,格式 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,格式y(tǒng)yyy-mm-dd hh:mm:ssdoc
nginx基本配置與參數(shù)說明
nginx配置文件說明
nginx與lua的執(zhí)行順序和步驟說明
ngx_lua用例說明
ngx_lua 模塊
lua-nginx-module模塊里ngx_lua的所有指令以及可用ngx所有方法
由一條OpenResty Error log談?wù)刵gx.exit與ngx.eof的區(qū)別
ngx_Lua模塊中的重定向
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/39747.html
摘要:例如響應(yīng)部分通過的形式獲取或設(shè)置響應(yīng)頭信息。以某個(gè)狀態(tài)碼返回響應(yīng)內(nèi)容,狀態(tài)碼常量對(duì)應(yīng)關(guān)系見部分,也支持?jǐn)?shù)字形式的狀態(tài)碼。重定向當(dāng)前請(qǐng)求到新的,響應(yīng)狀態(tài)碼可選列表為默認(rèn)。具體內(nèi)容如下相關(guān)文章進(jìn)入的世界在的應(yīng)用 首發(fā)于 樊浩柏科學(xué)院 當(dāng) Nginx 標(biāo)準(zhǔn)模塊和配置不能靈活地適應(yīng)系統(tǒng)要求時(shí),就可以考慮使用 Lua 擴(kuò)展和定制 Nginx 服務(wù)。OpenResty 集成了大量精良的 Lua 庫...
摘要:例如設(shè)置響應(yīng)狀態(tài)碼并退出注意,設(shè)置狀態(tài)碼僅在響應(yīng)頭發(fā)送前有效,并且該函數(shù)調(diào)用之后該函數(shù)后面的將被忽略掉,因?yàn)橐呀?jīng)了。 一、介紹 二、安裝 三、運(yùn)行 四、開發(fā) 1. 介紹 Tengine:輕量級(jí)、高性能、高并發(fā)、配置化、模塊化、可擴(kuò)展、可移植的Web和反向代理 服務(wù)器,Tengine是nginx超集,但做了很多優(yōu)化,包含了很多比較有用的模塊,比如直接包含了lua、proc等很...
摘要:例如設(shè)置響應(yīng)狀態(tài)碼并退出注意,設(shè)置狀態(tài)碼僅在響應(yīng)頭發(fā)送前有效,并且該函數(shù)調(diào)用之后該函數(shù)后面的將被忽略掉,因?yàn)橐呀?jīng)了。 一、介紹 二、安裝 三、運(yùn)行 四、開發(fā) 1. 介紹 Tengine:輕量級(jí)、高性能、高并發(fā)、配置化、模塊化、可擴(kuò)展、可移植的Web和反向代理 服務(wù)器,Tengine是nginx超集,但做了很多優(yōu)化,包含了很多比較有用的模塊,比如直接包含了lua、proc等很...
摘要:異常與默認(rèn)值為默認(rèn)值為秒。實(shí)驗(yàn)請(qǐng)求里頭的會(huì)發(fā)起一個(gè),請(qǐng)求請(qǐng)求一次對(duì)逐個(gè)請(qǐng)求,都失敗,則的返回,對(duì)返回的取決于腳本再請(qǐng)求一次該下面的都掛的情況下出現(xiàn)中健康檢查機(jī)制深入分析容錯(cuò)機(jī)制原創(chuàng)胡志廣線上的一次分析 異常 upstream server temporarily disabled while connecting to upstream no live upstreams while...
摘要:深度學(xué)習(xí)篇一動(dòng)靜分離通過中間件將動(dòng)態(tài)請(qǐng)求和靜態(tài)請(qǐng)求進(jìn)行分離。原因分離資源,減少不必要的請(qǐng)求消耗,減少請(qǐng)求延時(shí)。關(guān)閉后,重定向會(huì)失效。驗(yàn)證規(guī)則保持一致。啟動(dòng),也會(huì)要求你輸入密碼。根據(jù)用戶的信息等信息區(qū)別根據(jù)用戶的地址實(shí)現(xiàn)灰度發(fā)布示意圖 Nginx-深度學(xué)習(xí)篇 一、動(dòng)靜分離 通過中間件將動(dòng)態(tài)請(qǐng)求和靜態(tài)請(qǐng)求進(jìn)行分離。原因:分離資源,減少不必要的請(qǐng)求消耗,減少請(qǐng)求延時(shí)。 動(dòng)態(tài)和靜態(tài)請(qǐng)求圖例:s...
閱讀 2680·2023-04-25 18:10
閱讀 1619·2019-08-30 15:53
閱讀 2817·2019-08-30 13:10
閱讀 3231·2019-08-29 18:40
閱讀 1137·2019-08-23 18:31
閱讀 1210·2019-08-23 16:49
閱讀 3410·2019-08-23 16:07
閱讀 885·2019-08-23 15:27