1. 程式人生 > >openresty(nginx+lua)初識

openresty(nginx+lua)初識

1、新增專案配置檔案:

 

vim /usr/example/example1.conf


--將以下內容加入example1.conf
server {  
    listen       80;  
    server_name  _;
     #~ 表示匹配所有請求路徑
     #(\d+)/(\d+) 正則匹配 location ~ /lua_request/(\d+)/(\d+) { #設定nginx變數 set $a $1; set $b $host; default_type "text/html"; #nginx內容處理 content_by_lua_file /usr/example/lua/lua_request.lua; #內容體處理完成後呼叫 echo_after_body "ngx.var.b $b"; } }

 

2、編寫lua指令碼(獲取http請求資訊)

vim /usr/example/lua/lua_request.lua

--將以下內容加入lua_request.lua

--nginx變數
--ngx.var nginx變數,如對變數ngx.var.b = 2賦值,需要提前宣告。
--nginx location中使用正則捕獲陣列,所以可以使用ngx.var[index]獲取,index:索引值,此索引值預設從1開始 local var = ngx.var ngx.say("ngx.var.a :",var.a, "</br>") ngx.say("ngx.var.b :",var.b, "</br>") ngx.say("ngx.var[2] :",var[2], "</br>") ngx.var.b=2; ngx.say("</br>") --請求頭
--get_headers() 獲取請求頭,預設獲取請求頭的前100位,也可以使用get_headers(0)獲取所有 local headers = ngx.req.get_headers() ngx.say("headers begin","</br>")
--headers["請求頭中的key值"] ngx.say("Host :",headers["Host"],"</br>") ngx.say("user-agent :",headers["user-agent"],"</br>") ngx.say("user-agent :",headers.user_agent,"</br>") for k,v in pairs(headers) do if type(v) == "table" then ngx.say(k,":",table.concat(v,","),"</br>") else ngx.say(k,":",v,"</br>") end end ngx.say("headers end","</br>") ngx.say("</br>") --get請求URI引數 ngx.say("uri args begin","</br>")
--get_uri_args() 獲取請求引數 local uri_args = ngx.req.get_uri_args() for k,v in pairs(uri_args) do if type(v) =="table" then ngx.say(k,":",table.concat(v,", "),"</br>") else ngx.say(k,":",v,"</br>") end end ngx.say("uri args end","</br>") ngx.say("</br>") --post請求引數
--read_body() 讀取請求體;也可在nginx中配置 lua_need_request_body on; 不推薦此種配置方式 ngx.req.read_body() ngx.say("post args begin","</br>") local post_args =ngx.req.get_post_args() for k,v in pairs(post_args) do if type(v) == "table" then ngx.say(k, ":" ,table.concat(v,", "),"</br>") else ngx.say(k,":",v,"</br>") end end ngx.say("post args end","</br>") ngx.say("</br>") --請求http協議版本 ngx.say("ngx.req.http_version :",ngx.req.http_version(),"</br>") --請求方法 ngx.say("ngx.req.get_method : ", ngx.req.get_method(), "<br/>") --未解析的請求頭字串 ngx.say("ngx.req.raw_header:",ngx.req.raw_header(),"</br>") --未解析的body內容 ngx.say("ngx.req.get_body_dat :",ngx.req.get_body_data(),"</br>") ngx.say("</br>")

3、檢查配置檔案是否正確

./sbin/nginx -t

4、重啟openresty

 sudo /sbin/service openresty stop

 sudo /sbin/service openresty start

5、測試:

瀏覽器訪問:http://127.0.0.1/lll/lua_request/1/5/2?a=3&b=4

由於通過瀏覽器請求方式為get方式 ,所以post處沒有打印出有效資訊。

6、其他API

--重定向
ngx.redirect("http://www.baidu.com", 302)
--未解碼的uri
ngx.var.request_uri
--解碼
ngx.unescape_uri(request_uri)
--MD5加密
ngx.md5("44444444")
-- uri編碼解碼
ngx.escape_uri/ngx.unescape_uri
--引數編碼解碼
ngx.encode_args/ngx.decode_args
--BASE64編碼解碼
ngx.encode_base64/ngx.decode_base64
--nginx正則表示式匹配
ngx.re.match

 更多nginx  http api : http://wiki.nginx.org/HttpLuaModule#Nginx_API_for_Lua