[code.openresty] Openresty Nginx API for Lua -下

ngx.req.socket

語(yǔ)法: tcpsock, err = ngx.req.socket()

語(yǔ)法: tcpsock, err = ngx.req.socket(raw)

上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*

返回一個(gè)包含了下游連接的只讀的cosocket對(duì)象举塔。在這個(gè)對(duì)象里面计寇,只支持receivereceiveuntil方法故源。

在發(fā)生錯(cuò)誤的情況下,將會(huì)返回一個(gè)nil值和一個(gè)描述錯(cuò)誤的字符串威恼。

這個(gè)方法返回的socket對(duì)象經(jīng)常被用來(lái)讀取請(qǐng)求的body竹祷,以一個(gè)流的方式擅编。不要開(kāi)啟lua_need_request_body指令攀细,并且不要將這個(gè)調(diào)用與ngx.req.read_bodyngx.req.discard_body混合使用。

如果任何請(qǐng)求的body數(shù)據(jù)已經(jīng)被預(yù)讀到Nginx內(nèi)核請(qǐng)求header緩沖區(qū)中爱态,結(jié)果cosocket對(duì)象要小心的處理這些來(lái)避免這種預(yù)讀取中潛在的數(shù)據(jù)丟失谭贪。分塊請(qǐng)求的body在這個(gè)API中不支持。

v0.9.0版本開(kāi)始锦担,這個(gè)方法接受一個(gè)可選的 boolean raw參數(shù)俭识。當(dāng)這個(gè)參數(shù)是true,這個(gè)方法返回一個(gè)全雙工的cosocket對(duì)象包裝原始的下游連接套接字洞渔,在這里你可以調(diào)用receive, receiveuntil, 和 send方法套媚。

當(dāng)raw參數(shù)是true,要求這里沒(méi)有從之前ngx.say, ngx.print, 或者 ngx.send_headers 調(diào)用時(shí)未解決的數(shù)據(jù)存在磁椒。所以堤瘤,如果你之前有這些下游輸出調(diào)用,你應(yīng)該在調(diào)用ngx.req.socket(true)之前調(diào)用ngx.flush(true)來(lái)保證這里沒(méi)有未解決的輸出數(shù)據(jù)浆熔。如果請(qǐng)求body還沒(méi)有被讀取本辐,那么"raw socket"也可以被用來(lái)讀取請(qǐng)求的body。

你可以使用通過(guò)ngx.req.socket(true)返回的“raw request socket”來(lái)實(shí)現(xiàn)花哨的協(xié)議例如WebSocket蘸拔,或者只是發(fā)出你自己的未加工的HTTP響應(yīng)頭或者body數(shù)據(jù)师郑。你可以參考lua-resty-websocket library的一個(gè)真實(shí)世界的例子环葵。

這個(gè)方法首先從v0.5.0rc1版本被介紹调窍。

ngx.exec

語(yǔ)法: ngx.exec(uri,args?)

上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*

做一個(gè)內(nèi)部重定向到uri附帶參數(shù)arg并且和echo-nginx-module中的echo_exec相似。


  ngx.exec('/some-location');
  ngx.exec('/some-location', 'a=3&b=5&c=6');
  ngx.exec('/some-location?a=3&b=5', 'c=6');

這個(gè)可選的第二個(gè)參數(shù)args可以被用來(lái)指定額外的URI查詢參數(shù)张遭,例如:


  ngx.exec("/foo", "a=3&b=hello%20world")

作為另一種選擇邓萨,一個(gè)Lua table中可以被當(dāng)做args參數(shù)傳遞,ngx_lua來(lái)展開(kāi)URI轉(zhuǎn)義和字符串連接。


  ngx.exec("/foo",{ a = 3, b = "hello world" })

這個(gè)結(jié)果和之前的例子是完全相同的菊卷。

通過(guò)Lua table傳遞args參數(shù)的形式和通過(guò)使用ngx.encode_args方法是完全一樣的缔恳。

同樣也支持命名的location但是第二個(gè)args參數(shù)將會(huì)被忽略掉,如果查詢字符串存在并且新location會(huì)繼承自以前的location(如果有的話)洁闰。

在下面的例子中歉甚,GET /foo/file.php?a=hello將會(huì)返回“hello”而不是“goodbye”。


      location /foo {
          content_by_lua_block {
              ngx.exec("@bar","a=goodbye");
          }
      }

      location @bar {
          content_by_lua_block {
              local args = ngx.req.get_uri_args()
              for key, val in pairs(args) do
                    if key == "a" then
                        ngx.say(val)
                    end
              end
          }
      }

注意ngx.exec方法和ngx.redirect并不一樣扑眉,這是由于它是一個(gè)純粹的外部重定向并且不包括額外的HTTP流量纸泄。

并且注意這個(gè)方法調(diào)用終止當(dāng)前請(qǐng)求的處理并且它 必須ngx.send_headers或者ngx.printngx.say明確響應(yīng)body輸出之前調(diào)用赖钞。

建議編碼時(shí)候,將這個(gè)方法調(diào)用和return語(yǔ)句結(jié)合聘裁,例如:return ngx.exec(...)可以在除了header_filter_by_lua*之外的上下文中使用雪营,以強(qiáng)調(diào)程序已經(jīng)被終止的事實(shí)。

ngx.redirect

語(yǔ)法: ngx.redirect(uri, status?)

上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*

發(fā)出一個(gè)HTTP 301或者302重定向到uri衡便。

這個(gè)可選的status參數(shù)指定要使用的HTTP狀態(tài)∠灼穑現(xiàn)在支持下面的狀態(tài)碼:

  • 301
  • 302 (默認(rèn))
  • 303
  • 307

默認(rèn)的是 302 (ngx.HTTP_MOVED_TEMPORARILY)

這里有一個(gè)例子,假設(shè)當(dāng)前的服務(wù)器名稱是localhost镣陕,并且監(jiān)聽(tīng)的端口是 1984:


    return ngx.redirect("/foo")

等價(jià)于


 return ngx.redirect("/foo", ngx.HTTP_MOVED_TEMPORARILY)

支持重定向任意外部的URL谴餐,例如:


  return ngx.redirect("http://www.google.com")

我們也可以直接使用數(shù)值代碼作為第二個(gè)status參數(shù):


  return ngx.redirect("/foo",301)

這個(gè)方法和標(biāo)準(zhǔn)ngx_http_rewrite_module中的附帶redirect修飾符的rewrite 指令類似,例如茁彭,這個(gè)nginx.conf片段


  rewrite ^ /foo? redirect; # nginx config

等價(jià)于下面的Lua代碼


  return ngx.redirect('/foo'); -- Lua code


  rewrite ^ foo? permanent; #nginx config

等價(jià)于


  return ngx.redirect('/foo',ngx.HTTP_MOVED_PERMANENTLY)  -- Lua code

也可以指定URI參數(shù)总寒,例如:


 return ngx.redirect('/foo?a=3&b=4')

注意這個(gè)方法調(diào)用終止當(dāng)前請(qǐng)求的運(yùn)行并且它 必須ngx.send_headers調(diào)用或者通過(guò)ngx.print或者 ngx.say明確響應(yīng)body輸出之前。

建議的編碼風(fēng)格是理肺,將這個(gè)方法調(diào)用與一個(gè)return聲明結(jié)合摄闸,例如,return ngx.redirect(...)在除了header_filter_by_lua*之外的上下文中被接受妹萨,來(lái)強(qiáng)調(diào)一個(gè)事實(shí)就是這個(gè)請(qǐng)求處理已經(jīng)被終止了年枕。

ngx.send_headers

語(yǔ)法: ok, err = ngx.send_headers()

上下文: rewrite_by_lua*,access_by_lua*,content_by_lua*

顯示的發(fā)送出響應(yīng)頭。

v0.8.3版本這個(gè)方法在成功的時(shí)候返回1乎完,在其他情況下返回一個(gè)nil和一個(gè)字符串描述錯(cuò)誤熏兄。

注意通常情況下不需要手動(dòng)發(fā)送出響應(yīng)頭,因?yàn)閚gx_lua會(huì)在內(nèi)容通過(guò) ngx.say 或者 ngx.print輸出之前自動(dòng)的將響應(yīng)頭發(fā)出树姨,或者當(dāng)content_by_lua*正常退出時(shí)摩桶。

ngx.headers_sent

語(yǔ)法: value = ngx.headers_sent

上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*

如果響應(yīng)頭被發(fā)出去了(通過(guò)ngx_lua)將會(huì)返回true,其他情況返回false帽揪。

這個(gè)API首先在ngx_lua v0.3.1rc6版本中被介紹硝清。

ngx.print

語(yǔ)法: ok,err = ngx.print(...)

上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*

發(fā)出已經(jīng)連接過(guò)的參數(shù)到HTTP客戶端(作為響應(yīng)body)。如果響應(yīng)頭沒(méi)有被發(fā)送转晰,這個(gè)方法將會(huì)首先發(fā)出headers然后發(fā)出body數(shù)據(jù)芦拿。

v0.8.3,這個(gè)方法在成功后返回1查邢,在其他情況下返回nil和一個(gè)描述錯(cuò)誤信息的字符串蔗崎。

Lua nil值將會(huì)輸出"nil"字符串并且Lua boolean值將會(huì)分別輸出"true""false"文字字符串。

嵌套的字符串是數(shù)組是允許的并且數(shù)組中的元素將會(huì)被一個(gè)接著一個(gè)的輸出:


 local table = {
     "hello, ",
     {"world: ", true, " or ", false,
         {": ", nil}}
 }
 ngx.print(table)

將會(huì)產(chǎn)生輸出:


 hello, world: true or false: nil

非數(shù)組的表參數(shù)將會(huì)導(dǎo)致拋出一個(gè)Lua異常扰藕。

這個(gè)ngx.null常量將會(huì)產(chǎn)生"null"字符串輸出缓苛。

這是一個(gè)異步的調(diào)用并且將會(huì)立即返回而不需要等待所有的數(shù)據(jù)要寫入系統(tǒng)發(fā)送緩存區(qū)中。要開(kāi)啟同步模式邓深,在調(diào)用ngx.print之后調(diào)用ngx.flush(true)未桥。這個(gè)對(duì)流輸出特別有用番官。更多細(xì)節(jié)查看ngx.flush

請(qǐng)注意一點(diǎn)ngx.printngx.say會(huì)總是調(diào)用整個(gè)Nginx輸出body過(guò)濾鏈钢属,這個(gè)是一個(gè)昂貴的操作徘熔。所以在一個(gè)緊密循環(huán)中無(wú)論調(diào)用哪一個(gè)都要小心。你自己在Lua中緩沖數(shù)據(jù)并且保存調(diào)用淆党。

ngx.say

語(yǔ)法: ok, err = ngx.say(...)

上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*

ngx.print類似但是多發(fā)出一個(gè)換行符酷师。

ngx.log

語(yǔ)法: ngx.log(log_level, ...)

上下文: init_by_lua*, init_worker_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*

通過(guò)給定的logging級(jí)別來(lái)連接參數(shù)到error.log中。

Lua nil參數(shù)是接受的染乌,并且結(jié)果為文字的"nil"字符串山孔,同時(shí)Lua boolean結(jié)果為文字的"true"或者"false"字符串輸出。并且ngx.null常量將會(huì)產(chǎn)生"null"字符串輸出荷憋。

這個(gè)log_level參數(shù)可以取常數(shù)例如ngx.ERRngx.WARN.檢查Nginx log level constants來(lái)獲取細(xì)節(jié)台颠。

這里有個(gè)Nginx內(nèi)核硬編碼的2048字節(jié)的限制在錯(cuò)誤信息長(zhǎng)度上。這個(gè)限制包含結(jié)尾換行開(kāi)頭的時(shí)間戳勒庄。如果信息大小超過(guò)了這個(gè)限制串前,Nginx會(huì)相應(yīng)的截取信息字符串。這個(gè)限制可以通過(guò)編輯在Nginx源碼樹(shù)種的src/core/ngx_log.h 文件的NGX_MAX_ERROR_STR宏定義來(lái)修改实蔽。

ngx.flush

語(yǔ)法: ok, err = ngx.flush(wait?)

上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*

Flush 響應(yīng)輸出到客戶端荡碾。

ngx.flush接受一個(gè)可選的boolean wait參數(shù)(默認(rèn):false),首先在v0.3.1rc34版本中介紹局装。當(dāng)通過(guò)默認(rèn)的參數(shù)調(diào)用的時(shí)候坛吁,它纏身給一個(gè)異步的調(diào)用(立即返回而不等待輸出數(shù)據(jù)被寫入到系統(tǒng)的發(fā)送緩沖中)。通過(guò)wait參數(shù)設(shè)置為true調(diào)用這個(gè)方法會(huì)轉(zhuǎn)變?yōu)橥侥J健?/p>

在同步模式铐尚,這個(gè)方法將會(huì)不會(huì)返回直到所有的輸出數(shù)據(jù)已經(jīng)被寫入到系統(tǒng)輸出緩沖中或者直到send_timeout設(shè)置已經(jīng)過(guò)期了拨脉。注意使用Lua協(xié)同程序機(jī)制意味著這個(gè)方法并不阻塞Nginx事件循環(huán)及時(shí)在同步模式。

當(dāng)ngx.flush(true)ngx.print或者ngx.say之后被立即調(diào)用宣增,這回導(dǎo)致后者的方法在同步模式下運(yùn)行玫膀。這個(gè)在流輸出中特別有用。

注意ngx.flush在HTTP 1.0輸出緩沖模式中并不是一個(gè)功能统舀。查看HTTP 1.0 support匆骗。

v0.8.3開(kāi)始這個(gè)方法在成功之后返回1劳景,在其他情況下返回nil和一個(gè)字符串來(lái)描述錯(cuò)誤誉简。

ngx.exit

語(yǔ)法: ngx.exit(status)

上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*

當(dāng)status >= 200 (例如,ngx.HTTP_OK和以上)盟广,它將會(huì)中斷當(dāng)前的請(qǐng)求并且返回狀態(tài)碼給nginx闷串。

當(dāng)status == 0 (例如,ngx.OK)筋量,它將會(huì)退出當(dāng)前的階段處理器(或者內(nèi)容處理器如果 content_by_lua*指令被使用了)并且為當(dāng)前請(qǐng)求繼續(xù)運(yùn)行后面的階段(如果有的話)烹吵。

這個(gè)status參數(shù)可以使ngx.OK, ngx.ERROR碉熄,ngx.HTTP_NOT_FOUNDngx.HTTP_MOVED_TEMPORARILY肋拔,或者其他 HTTP status constants锈津。

要返回一個(gè)包含當(dāng)前內(nèi)容的錯(cuò)誤頁(yè),可以使用像這樣的代碼片段:


 ngx.status = ngx.HTTP_GONE
 ngx.say("This is our own content")
 -- to cause quit the whole request rather than the current phase handler
 ngx.exit(ngx.HTTP_OK)

執(zhí)行的效果:


 $ curl -i http://localhost/test
 HTTP/1.1 410 Gone
 Server: nginx/1.0.6
 Date: Thu, 15 Sep 2011 00:51:48 GMT
 Content-Type: text/plain
 Transfer-Encoding: chunked
 Connection: keep-alive

 This is our own content

數(shù)值文本可以直接被用在參數(shù)上凉蜂,例如琼梆,


 ngx.exit(501)

注意盡管這個(gè)方法接受所有的 HTTP status constants作為輸入,它只接受core constants中的NGX_OKNGX_ERROR窿吩。

還要注意茎杂,這個(gè)方法調(diào)用歐冠終止當(dāng)前請(qǐng)求的處理并且建議的編碼風(fēng)格是將這個(gè)方法調(diào)用歐冠與一個(gè)return聲明連接,例如纫雁, return ngx.exit(...)被用來(lái)強(qiáng)調(diào)一個(gè)事實(shí)是請(qǐng)求處理已經(jīng)被終止了煌往。

當(dāng)用在header_filter_by_lua*, balancer_by_lua*, 和
ssl_session_store_by_lua*的上下中時(shí),ngx.exit()作為一個(gè)異步的操作將會(huì)立即返回轧邪。這個(gè)行為在未來(lái)可能會(huì)改變并且推薦用戶使用上面推薦的return來(lái)結(jié)合使用刽脖。

ngx.eof

語(yǔ)法: ok, err = ngx.eof()

上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*

顯示的指定響應(yīng)輸出流的結(jié)束。在HTTP 1.1分塊編碼輸出的情況下忌愚,它將只是會(huì)觸發(fā)Nginx內(nèi)核發(fā)送出"last chunk"曾棕。

當(dāng)你在你下游連接中禁用了HTTP 1.1的keep-alive特性時(shí),你可以調(diào)用這個(gè)方法來(lái)寫到HTTP client來(lái)主動(dòng)的關(guān)閉連接菜循。這個(gè)技巧可以用在做一些后臺(tái)工作而不讓HTTP客戶端等待連接翘地,例如下面的例子:


 location = /async {
     keepalive_timeout 0;
     content_by_lua_block {
         ngx.say("got the task!")
         ngx.eof()  -- well written HTTP clients will close the connection at this point
         -- access MySQL, PostgreSQL, Redis, Memcached, and etc here...
     }
 }

但是如果你創(chuàng)建子請(qǐng)求來(lái)訪問(wèn)其他通過(guò)nginx upstream模塊配置的location,那么你應(yīng)該配置這些upstream模塊來(lái)忽略客戶端連接中斷癌幕,如果他們不是默認(rèn)情況的話衙耕。例如,在默認(rèn)情況下標(biāo)準(zhǔn)的ngx_http_proxy_module將會(huì)同時(shí)中斷子請(qǐng)求和主請(qǐng)求勺远,當(dāng)客戶端重點(diǎn)連接時(shí)橙喘,所以在你的location塊ngx_http_proxy_module配置中開(kāi)啟proxy_ignore_client_abort](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_client_abort) 指令是非常重要的。


 proxy_ignore_client_abort on;

一個(gè)更好的來(lái)做后臺(tái)工作的方式是使用ngx.timer.atAPI接口胶逢。

v0.8.3開(kāi)始這個(gè)方法在成功時(shí)候返回1厅瞎,在其他錯(cuò)誤情況下返回nil和一個(gè)字符串描述。

ngx.sleep

語(yǔ)法: ngx.sleep(seconds)

上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*, ngx.timer.*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*

睡眠指定的描述而不阻塞初坠『汪ぃ可以指定一個(gè)時(shí)間分辨率達(dá)到0.001秒(例如:一毫秒)。

在后面的場(chǎng)景碟刺,這個(gè)方法使用的是Nginx timers锁保。

0.7.20版本開(kāi)始,這個(gè)0時(shí)間參數(shù)也可以被指定。

這個(gè)方法首先在0.5.0rc30版本中被介紹爽柒。

ngx.escape_uri

語(yǔ)法: newstr = ngx.escape_uri(str)

上下文: init_by_lua*, init_worker_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*

編碼str來(lái)作為URI組件吴菠。

ngx.unescape_uri

語(yǔ)法: newstr = ngx.unescape_uri(str)

上下文: init_by_lua*, init_worker_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*

解碼str,str是一個(gè)編碼過(guò)的URI組件浩村。

例如:


 ngx.say(ngx.unescape_uri("b%20r56+7"))

得到輸出


    b r56 7

ngx.encode_args

語(yǔ)法: str = ngx.encode_args(table)

上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*

根據(jù)URI的編碼規(guī)則編碼Lua table為一個(gè)查詢參數(shù)字符串做葵。

例如,


 ngx.encode_args({foo = 3, ["b r"] = "hello world"})

產(chǎn)生


foo=3&b%20r=hello%20world

這個(gè)table的keys必須是Lua字符串心墅。

同時(shí)也支持多值查詢參數(shù)蜂挪。使用一個(gè)lua table來(lái)作為參數(shù)值,例如:


 ngx.encode_args({baz = {32, "hello"}})

得到


    baz=32&baz=hello

如果這個(gè)value table為空那么影響等價(jià)于nil值嗓化。

同時(shí)也支持boolean參數(shù)值棠涮,例如,


 ngx.encode_args({a = true, b = 1})

產(chǎn)生


    a&b=1

如果這個(gè)參數(shù)值為false刺覆,那么影響等價(jià)于nil值严肪。

這個(gè)方法首先在 v0.3.1rc27版本中被介紹。

ngx.decode_args

語(yǔ)法: table = ngx.decode_args(str, max_args?)

上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*

將一個(gè)編碼過(guò)的查詢字符串解碼為一個(gè)Lua table谦屑。這個(gè)是ngx.encode_args的相反的方法驳糯。

這個(gè)可選的max_args參數(shù)可以被用來(lái)指定通過(guò)str參數(shù)解析的參數(shù)數(shù)量的最大值。默認(rèn)情況下氢橙,默認(rèn)解析100個(gè)請(qǐng)求參數(shù)(包括這些名字相同的)并且額外的URI參數(shù)會(huì)被默默的丟棄來(lái)防止?jié)撛诘木芙^服務(wù)攻擊酝枢。

這個(gè)參數(shù)可以被設(shè)置為0來(lái)移除對(duì)接受請(qǐng)求參數(shù)處理的限制:


 local args = ngx.decode_args(str, 0)

強(qiáng)烈不建議移除max_args

這個(gè)方法首先在v0.5.0rc29版本中被介紹悍手。

encode_base64

語(yǔ)法: newstr = ngx.encode_base64(str, no_padding?)

上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*

編碼str成為一個(gè)base64摘要帘睦。

0.9.16版本開(kāi)始,一個(gè)可選的boolean類型no_padding參數(shù)可以被指定來(lái)控制是否base64摘要應(yīng)該被追加到結(jié)果摘要中(默認(rèn)是false坦康,例如竣付,使用啟用追加)。

ngx.decode_base64

語(yǔ)法: newstr = ngx.decode_base64(str)

上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*

解碼str參數(shù)將base64摘要成為一個(gè)原始的形式滞欠。如果str不是正常形式返回nil古胆。

ngx.crc32_short

語(yǔ)法: intval = ngx.crc32_short(str)

上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*

計(jì)算str字符串的CRC-32(循環(huán)冗余碼)摘要。

這個(gè)方法對(duì)較短的str輸入(例如筛璧,小于30~60bytes)表現(xiàn)較好逸绎,和ngx.crc32_long相比。這個(gè)結(jié)果和ngx.crc32_long完全一樣夭谤。

幕后的實(shí)現(xiàn)棺牧,這個(gè)只是一個(gè)薄薄的對(duì)Nginx核心中的ngx_crc32_short的封裝。

這個(gè)API首先在v0.3.1rc8版本中被介紹沮翔。

ngx.crc32_long

語(yǔ)法: intval = ngx.crc32_long(str)

上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*

計(jì)算參數(shù)strHMAC-SHA1摘要陨帆,并且返回使用密鑰<secret_key>的結(jié)果。

原始字節(jié)形式的HMAC-SHA1證書將會(huì)生成采蚀,使用ngx.encode_base64疲牵,例如,如果需要的話將結(jié)果以結(jié)果的文本表示榆鼠。

例如纲爸,


 local key = "thisisverysecretstuff"
 local src = "some string we want to sign"
 local digest = ngx.hmac_sha1(key, src)
 ngx.say(ngx.encode_base64(digest))

將會(huì)導(dǎo)致輸出:


    R/pvxzHC4NLtj7S+kXFg/NePTmk=

這個(gè)API需要在Nginx編譯的時(shí)候開(kāi)啟OpenSSL庫(kù)(通常在./configure腳本里面?zhèn)魅?code>--with-http_ssl_module參數(shù))

這個(gè)方法首先在v0.3.1rc29版本中被介紹。

ngx.md5

語(yǔ)法: ngx.md5(str)

上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*

返回str參數(shù)的16進(jìn)制的MD5摘要妆够。

例如识啦,


 location = /md5 {
     content_by_lua_block { ngx.say(ngx.md5("hello")) }
 }

產(chǎn)生輸出


    5d41402abc4b2a76b9719d911017c592

查看ngx.md5_bin,如果需要原始的MD5摘要。

ngx.sha1_bin

語(yǔ)法: digest = ngx.sha1_bin(str)

上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*

返回str參數(shù)的二級(jí)制形式的SHA-1摘要神妹。

這個(gè)方法需要在Nginx編譯時(shí)的SHA-1支持颓哮。(這個(gè)經(jīng)常意味著在構(gòu)建Nginx時(shí)需要安裝OpenSSL)

這個(gè)方法首先在v0.5.0rc6中被介紹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸵荠,一起剝皮案震驚了整個(gè)濱河市冕茅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛹找,老刑警劉巖姨伤,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異庸疾,居然都是意外死亡乍楚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門届慈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)徒溪,“玉大人,你說(shuō)我怎么就攤上這事金顿〈什常” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵串绩,是天一觀的道長(zhǎng)缺虐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)礁凡,這世上最難降的妖魔是什么高氮? 我笑而不...
    開(kāi)封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮顷牌,結(jié)果婚禮上剪芍,老公的妹妹穿的比我還像新娘。我一直安慰自己窟蓝,他們只是感情好罪裹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般状共。 火紅的嫁衣襯著肌膚如雪套耕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天峡继,我揣著相機(jī)與錄音冯袍,去河邊找鬼。 笑死碾牌,一個(gè)胖子當(dāng)著我的面吹牛康愤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舶吗,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼征冷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了誓琼?” 一聲冷哼從身側(cè)響起资盅,我...
    開(kāi)封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踊赠,沒(méi)想到半個(gè)月后呵扛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筐带,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年今穿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伦籍。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蓝晒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帖鸦,到底是詐尸還是另有隱情芝薇,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布作儿,位于F島的核電站洛二,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏攻锰。R本人自食惡果不足惜晾嘶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娶吞。 院中可真熱鬧垒迂,春花似錦、人聲如沸妒蛇。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吏奸,卻和暖如春欢揖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背苦丁。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工浸颓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留物臂,地道東北人旺拉。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像棵磷,于是被迫代替她去往敵國(guó)和親蛾狗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容