Nginx入門
本文目的是學(xué)習(xí)Nginx+Lua開發(fā)厌蔽,對于Nginx基本知識可以參考如下文章:
nginx啟動谆奥、關(guān)閉哎榴、重啟
http://www.cnblogs.com/derekchen/archive/2011/02/17/1957209.html
agentzh 的 Nginx 教程
http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
Nginx+Lua入門
http://17173ops.com/2013/11/01/17173-ngx-lua-manual.shtml
nginx 配置指令的執(zhí)行順序
http://zhongfox.github.io/blog/server/2013/05/15/nginx-exec-order/
nginx與lua的執(zhí)行順序和步驟說明
http://www.mrhaoting.com/?p=157
Nginx配置文件nginx.conf中文詳解
Tengine的Nginx開發(fā)從入門到精通
http://tengine.taobao.org/book/
官方文檔
http://wiki.nginx.org/Configuration
Lua入門
本文目的是學(xué)習(xí)Nginx+Lua開發(fā)琼蚯,對于Lua基本知識可以參考如下文章:
Lua簡明教程
http://coolshell.cn/articles/10739.html
lua在線lua學(xué)習(xí)教程
Lua 5.1 參考手冊
http://www.codingnow.com/2000/download/lua_manual.html
Lua5.3 參考手冊
http://cloudwu.github.io/lua53doc/
Nginx Lua API
和一般的Web Server類似蜕着,我們需要接收請求谋竖、處理并輸出響應(yīng)。而對于請求我們需要獲取如請求參數(shù)承匣、請求頭蓖乘、Body體等信息;而對于處理就是調(diào)用相應(yīng)的Lua代碼即可韧骗;輸出響應(yīng)需要進行響應(yīng)狀態(tài)碼嘉抒、響應(yīng)頭和響應(yīng)內(nèi)容體的輸出。因此我們從如上幾個點出發(fā)即可袍暴。
接收請求
1些侍、example.conf配置文件?
Java代碼
location?~?/lua_request/(\d+)/(\d+)?{??
????#設(shè)置nginx變量??
set?$a?$1;???
????set?$b?$host;??
default_type"text/html";??
????#nginx內(nèi)容處理??
????content_by_lua_file?/usr/example/lua/test_request.lua;??
????#內(nèi)容體處理完成后調(diào)用??
echo_after_body"ngx.var.b?$b";??
}??
2隶症、test_request.lua?
Java代碼
--nginx變量??
local?var?=?ngx.var??
ngx.say("ngx.var.a?:?",?var.a,?"
")??
ngx.say("ngx.var.b?:?",?var.b,?"
")??
ngx.say("ngx.var[2]?:?",?var[2],?"
")??
ngx.var.b?=2;??
ngx.say("
")??
--請求頭??
local?headers?=?ngx.req.get_headers()??
ngx.say("headers?begin",?"
")??
ngx.say("Host?:?",?headers["Host"],?"
")??
ngx.say("user-agent?:?",?headers["user-agent"],?"
")??
ngx.say("user-agent?:?",?headers.user_agent,?"
")??
for?k,v?in?pairs(headers)?do??
if?type(v)?==?"table"?then??
ngx.say(k,"?:?",?table.concat(v,?","),?"
")??
else??
ngx.say(k,"?:?",?v,?"
")??
????end??
end??
ngx.say("headers?end",?"
")??
ngx.say("
")??
--get請求uri參數(shù)??
ngx.say("uri?args?begin",?"
")??
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,?",?"),?"
")??
else??
ngx.say(k,":?",?v,?"
")??
????end??
end??
ngx.say("uri?args?end",?"
")??
ngx.say("
")??
--post請求參數(shù)??
ngx.req.read_body()??
ngx.say("post?args?begin",?"
")??
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,?",?"),?"
")??
else??
ngx.say(k,":?",?v,?"
")??
????end??
end??
ngx.say("post?args?end",?"
")??
ngx.say("
")??
--請求的http協(xié)議版本??
ngx.say("ngx.req.http_version?:?",?ngx.req.http_version(),?"
")??
--請求方法??
ngx.say("ngx.req.get_method?:?",?ngx.req.get_method(),?"
")??
--原始的請求頭內(nèi)容??
ngx.say("ngx.req.raw_header?:?",??ngx.req.raw_header(),?"
")??
--請求的body內(nèi)容體??
ngx.say("ngx.req.get_body_data()?:?",?ngx.req.get_body_data(),?"
")??
ngx.say("
")??
ngx.var?: nginx變量,如果要賦值如ngx.var.b = 2岗宣,此變量必須提前聲明蚂会;另外對于nginx location中使用正則捕獲的捕獲組可以使用ngx.var[捕獲組數(shù)字]獲取耗式;
ngx.req.get_headers:獲取請求頭胁住,默認(rèn)只獲取前100,如果想要獲取所以可以調(diào)用ngx.req.get_headers(0)刊咳;獲取帶中劃線的請求頭時請使用如headers.user_agent這種方式彪见;如果一個請求頭有多個值,則返回的是table娱挨;
ngx.req.get_uri_args:獲取url請求參數(shù)余指,其用法和get_headers類似;
ngx.req.get_post_args:獲取post請求內(nèi)容體跷坝,其用法和get_headers類似浪规,但是必須提前調(diào)用ngx.req.read_body()來讀取body體(也可以選擇在nginx配置文件使用lua_need_request_body on;開啟讀取body體,但是官方不推薦)探孝;
ngx.req.raw_header:未解析的請求頭字符串笋婿;
ngx.req.get_body_data:為解析的請求body體內(nèi)容字符串。
如上方法處理一般的請求基本夠用了顿颅。另外在讀取post內(nèi)容體時根據(jù)實際情況設(shè)置client_body_buffer_size和client_max_body_size來保證內(nèi)容在內(nèi)存而不是在文件中缸濒。
使用如下腳本測試
Java代碼
wget?--post-data?'a=1&b=2'?'http://127.0.0.1/lua_request/1/2?a=3&b=4'?-O?-???
輸出響應(yīng)
1.1、example.conf配置文件
Java代碼
location?/lua_response_1?{??
default_type"text/html";??
????content_by_lua_file?/usr/example/lua/test_response_1.lua;??
}??
1.2粱腻、test_response_1.lua?
Java代碼
--寫響應(yīng)頭??
ngx.header.a?="1"??
--多個響應(yīng)頭可以使用table??
ngx.header.b?=?{"2",?"3"}??
--輸出響應(yīng)??
ngx.say("a",?"b",?"
")??
ngx.print("c",?"d",?"
")??
--200狀態(tài)碼退出??
return?ngx.exit(200)??
ngx.header:輸出響應(yīng)頭庇配;
ngx.print:輸出響應(yīng)內(nèi)容體;
ngx.say:通ngx.print绍些,但是會最后輸出一個換行符捞慌;
ngx.exit:指定狀態(tài)碼退出。
2.1柬批、example.conf配置文件
Java代碼
location?/lua_response_2?{??
default_type"text/html";??
????content_by_lua_file?/usr/example/lua/test_response_2.lua;??
}??
2.2啸澡、test_response_2.lua
Java代碼
ngx.redirect("http://jd.com",?302)??
ngx.redirect:重定向;
ngx.status=狀態(tài)碼氮帐,設(shè)置響應(yīng)的狀態(tài)碼嗅虏;ngx.resp.get_headers()獲取設(shè)置的響應(yīng)狀態(tài)碼;ngx.send_headers()發(fā)送響應(yīng)狀態(tài)碼上沐,當(dāng)調(diào)用ngx.say/ngx.print時自動發(fā)送響應(yīng)狀態(tài)碼皮服;可以通過ngx.headers_sent=true判斷是否發(fā)送了響應(yīng)狀態(tài)碼。
其他API
1、example.conf配置文件
Java代碼
location?/lua_other?{??
default_type"text/html";??
????content_by_lua_file?/usr/example/lua/test_other.lua;??
}??
2龄广、test_other.lua
Java代碼
--未經(jīng)解碼的請求uri??
local?request_uri?=?ngx.var.request_uri;??
ngx.say("request_uri?:?",?request_uri,?"
");??
--解碼??
ngx.say("decode?request_uri?:?",?ngx.unescape_uri(request_uri),?"
");??
--MD5??
ngx.say("ngx.md5?:?",?ngx.md5("123"),?"
")??
--http?time??
ngx.say("ngx.http_time?:?",?ngx.http_time(ngx.time()),?"
")??
ngx.escape_uri/ngx.unescape_uri?: uri編碼解碼硫眯;
ngx.encode_args/ngx.decode_args:參數(shù)編碼解碼;
ngx.encode_base64/ngx.decode_base64:BASE64編碼解碼择同;
ngx.re.match:nginx正則表達式匹配舟铜;
更多Nginx Lua API請參考http://wiki.nginx.org/HttpLuaModule#Nginx_API_for_Lua。
Nginx全局內(nèi)存
使用過如Java的朋友可能知道如Ehcache等這種進程內(nèi)本地緩存奠衔,Nginx是一個Master進程多個Worker進程的工作方式谆刨,因此我們可能需要在多個Worker進程中共享數(shù)據(jù),那么此時就可以使用ngx.shared.DICT來實現(xiàn)全局內(nèi)存共享归斤。
1痊夭、首先在nginx.conf的http部分分配內(nèi)存大小
Java代碼
#共享全局變量,在所有worker間共享??
lua_shared_dict?shared_data?1m;??
2脏里、example.conf配置文件
Java代碼
location?/lua_shared_dict?{??
default_type"text/html";??
????content_by_lua_file?/usr/example/lua/test_lua_shared_dict.lua;??
}??
3她我、?test_lua_shared_dict.lua
Java代碼
--1、獲取全局共享內(nèi)存變量??
local?shared_data?=?ngx.shared.shared_data??
--2迫横、獲取字典值??
local?i?=?shared_data:get("i")??
if?not?i?then??
i?=1??
--3番舆、惰性賦值??
shared_data:set("i",?i)??
ngx.say("lazy?set?i?",?i,?"
")??
end??
--遞增??
i?=?shared_data:incr("i",?1)??
ngx.say("i=",?i,?"
")??
更多API請參考http://wiki.nginx.org/HttpLuaModule#ngx.shared.DICT。
到此基本的Nginx Lua API就學(xué)完了矾踱,對于請求處理和輸出響應(yīng)如上介紹的API完全夠用了恨狈,更多API請參考官方文檔。
Nginx Lua模塊指令
Nginx共11個處理階段呛讲,而相應(yīng)的處理階段是可以做插入式處理禾怠,即可插拔式架構(gòu);另外指令可以在http贝搁、server吗氏、server if、location雷逆、location if幾個范圍進行配置:
指令所處處理階段使用范圍解釋
init_by_lua
init_by_lua_file
loading-confighttpnginx Master進程加載配置時執(zhí)行弦讽;
通常用于初始化全局配置/預(yù)加載Lua模塊
init_worker_by_lua
init_worker_by_lua_file
starting-workerhttp每個Nginx Worker進程啟動時調(diào)用的計時器,如果Master進程不允許則只會在init_by_lua之后調(diào)用膀哲;
通常用于定時拉取配置/數(shù)據(jù)往产,或者后端服務(wù)的健康檢查
set_by_lua
set_by_lua_file
rewriteserver,server if,location,location if設(shè)置nginx變量,可以實現(xiàn)復(fù)雜的賦值邏輯等太;此處是阻塞的捂齐,Lua代碼要做到非常快缩抡;
rewrite_by_lua
rewrite_by_lua_file
rewrite tailhttp,server,location,location ifrrewrite階段處理,可以實現(xiàn)復(fù)雜的轉(zhuǎn)發(fā)/重定向邏輯;
access_by_lua
access_by_lua_file
access tailhttp,server,location,location if請求訪問階段處理瞻想,用于訪問控制
content_by_lua
content_by_lua_file
contentlocation压真,location if內(nèi)容處理器,接收請求處理并輸出響應(yīng)
header_filter_by_lua
header_filter_by_lua_file
output-header-filterhttp蘑险,server滴肿,location,location if設(shè)置header和cookie
body_filter_by_lua
body_filter_by_lua_file
output-body-filterhttp佃迄,server泼差,location,location if對響應(yīng)數(shù)據(jù)進行過濾呵俏,比如截斷堆缘、替換。
log_by_lua
log_by_lua_file
loghttp普碎,server吼肥,location,location iflog階段處理麻车,比如記錄訪問量/統(tǒng)計平均響應(yīng)時間
更詳細的解釋請參考http://wiki.nginx.org/HttpLuaModule#Directives缀皱。如上指令很多并不常用,因此我們只拿其中的一部分做演示动猬。
init_by_lua
每次Nginx重新加載配置時執(zhí)行啤斗,可以用它來完成一些耗時模塊的加載,或者初始化一些全局配置赁咙;在Master進程創(chuàng)建Worker進程時争占,此指令中加載的全局變量會進行Copy-OnWrite,即會復(fù)制到所有全局變量到Worker進程序目。
1臂痕、nginx.conf配置文件中的http部分添加如下代碼
Java代碼
#共享全局變量,在所有worker間共享??
lua_shared_dict?shared_data?1m;??
init_by_lua_file?/usr/example/lua/init.lua;??
2猿涨、init.lua
Java代碼
--初始化耗時的模塊??
local?redis?=?require'resty.redis'??
local?cjson?=?require'cjson'??
--全局變量握童,不推薦??
count?=1??
--共享全局內(nèi)存??
local?shared_data?=?ngx.shared.shared_data??
shared_data:set("count",?1)??
3、test.lua
Java代碼
count?=?count?+?1??
ngx.say("global?variable?:?",?count)??
local?shared_data?=?ngx.shared.shared_data??
ngx.say(",?shared?memory?:?",?shared_data:get("count"))??
shared_data:incr("count",?1)??
ngx.say("hello?world")??
4叛赚、訪問如http://192.168.1.2/lua 會發(fā)現(xiàn)全局變量一直不變澡绩,而共享內(nèi)存一直遞增
global variable : 2 , shared memory : 8 hello world?
另外注意一定在生產(chǎn)環(huán)境開啟lua_code_cache,否則每個請求都會創(chuàng)建Lua VM實例俺附。
init_worker_by_lua
用于啟動一些定時任務(wù)肥卡,比如心跳檢查,定時拉取服務(wù)器配置等等事镣;此處的任務(wù)是跟Worker進程數(shù)量有關(guān)系的步鉴,比如有2個Worker進程那么就會啟動兩個完全一樣的定時任務(wù)。
1、nginx.conf配置文件中的http部分添加如下代碼
Java代碼
init_worker_by_lua_file?/usr/example/lua/init_worker.lua;??
2氛琢、init_worker.lua
Java代碼
local?count?=?0??
local?delayInSeconds?=3??
local?heartbeatCheck?=?nil??
heartbeatCheck?=?function(args)??
count?=?count?+1??
ngx.log(ngx.ERR,"do?check?",?count)??
???local?ok,?err?=?ngx.timer.at(delayInSeconds,?heartbeatCheck)??
if?not?ok?then??
ngx.log(ngx.ERR,"failed?to?startup?heartbeart?worker...",?err)??
???end??
end??
heartbeatCheck()??
ngx.timer.at:延時調(diào)用相應(yīng)的回調(diào)方法喊递;ngx.timer.at(秒單位延時,回調(diào)函數(shù)阳似,回調(diào)函數(shù)的參數(shù)列表)骚勘;可以將延時設(shè)置為0即得到一個立即執(zhí)行的任務(wù),任務(wù)不會在當(dāng)前請求中執(zhí)行不會阻塞當(dāng)前請求撮奏,而是在一個輕量級線程中執(zhí)行俏讹。
另外根據(jù)實際情況設(shè)置如下指令
lua_max_pending_timers 1024; ?#最大等待任務(wù)數(shù)
lua_max_running_timers 256; ? ?#最大同時運行任務(wù)數(shù)
set_by_lua?
設(shè)置nginx變量,我們用的set指令即使配合if指令也很難實現(xiàn)負責(zé)的賦值邏輯畜吊;
1.1泽疆、example.conf配置文件
Java代碼
location?/lua_set_1?{??
default_type"text/html";??
????set_by_lua_file?$num?/usr/example/lua/test_set_1.lua;??
????echo?$num;??
}??
set_by_lua_file:語法set_by_lua_file $var lua_file arg1 arg2...; 在lua代碼中可以實現(xiàn)所有復(fù)雜的邏輯,但是要執(zhí)行速度很快定拟,不要阻塞于微;
1.2、test_set_1.lua
Java代碼
local?uri_args?=?ngx.req.get_uri_args()??
local?i?=?uri_args["i"]?or?0??
local?j?=?uri_args["j"]?or?0??
return?i?+?j??
得到請求參數(shù)進行相加然后返回青自。
訪問如http://192.168.1.2/lua_set_1?i=1&j=10進行測試株依。 如果我們用純set指令是無法實現(xiàn)的。
再舉個實際例子延窜,我們實際工作時經(jīng)常涉及到網(wǎng)站改版恋腕,有時候需要新老并存,或者切一部分流量到新版
2.1逆瑞、首先在example.conf中使用map指令來映射host到指定nginx變量荠藤,方便我們測試
Java代碼
############?測試時使用的動態(tài)請求??
map?$host?$item_dynamic?{??
default?????????????????????"0";??
item2014.jd.com"1";??
}??
如綁定hosts
192.168.1.2 item.jd.com;
192.168.1.2 item2014.jd.com;
此時我們想訪問item2014.jd.com時訪問新版,那么我們可以簡單的使用如
Java代碼
if?($item_dynamic?=?"1")?{??
proxy_pass?http://new;??
}??
proxy_pass?http://old;??
但是我們想把商品編號為為8位(比如品類為圖書的)沒有改版完成获高,需要按照相應(yīng)規(guī)則跳轉(zhuǎn)到老版哈肖,但是其他的到新版;雖然使用if指令能實現(xiàn)念秧,但是比較麻煩淤井,基本需要這樣
Java代碼
set?jump?"0";??
if($item_dynamic?=?"1")?{??
set?$jump"1";??
}??
if(uri?~?"^/6[0-9]{7}.html")?{??
set?$jump"${jump}2";??
}??
#非強制訪問新版,且訪問指定范圍的商品??
if?(jump?==?"02")?{??
proxy_pass?http://old;??
}??
proxy_pass?http://new;??
以上規(guī)則還是比較簡單的摊趾,如果涉及到更復(fù)雜的多重if/else或嵌套if/else實現(xiàn)起來就更痛苦了币狠,可能需要到后端去做了;此時我們就可以借助lua了:
Java代碼
set_by_lua?$to_book?'??
?????local?ngx_match?=?ngx.re.match??
?????local?var?=?ngx.var??
?????local?skuId?=?var.skuId??
local?r?=?var.item_dynamic?~="1"?and?ngx.re.match(skuId,?"^[0-9]{8}$")??
if?r?then?return?"1"?else?return?"0"?end;??
';??
set_by_lua?$to_mvd?'??
?????local?ngx_match?=?ngx.re.match??
?????local?var?=?ngx.var??
?????local?skuId?=?var.skuId??
local?r?=?var.item_dynamic?~="1"?and?ngx.re.match(skuId,?"^[0-9]{9}$")??
if?r?then?return?"1"?else?return?"0"?end;??
';??
#自營圖書??
if?($to_book)?{??
proxy_pass?http://127.0.0.1/old_book/$skuId.html;??
}??
#自營音像??
if?($to_mvd)?{??
proxy_pass?http://127.0.0.1/old_mvd/$skuId.html;??
}??
#默認(rèn)??
proxy_pass?http://127.0.0.1/proxy/$skuId.html;??
rewrite_by_lua?
執(zhí)行內(nèi)部URL重寫或者外部重定向砾层,典型的如偽靜態(tài)化的URL重寫漩绵。其默認(rèn)執(zhí)行在rewrite處理階段的最后。
1.1肛炮、example.conf配置文件
Java代碼
location?/lua_rewrite_1?{??
default_type"text/html";??
????rewrite_by_lua_file?/usr/example/lua/test_rewrite_1.lua;??
echo"no?rewrite";??
}??
1.2止吐、test_rewrite_1.lua
Java代碼
if?ngx.req.get_uri_args()["jump"]?==?"1"?then??
return?ngx.redirect("http://www.jd.com?jump=1",?302)??
end??
當(dāng)我們請求http://192.168.1.2/lua_rewrite_1時發(fā)現(xiàn)沒有跳轉(zhuǎn)宝踪,而請求http://192.168.1.2/lua_rewrite_1?jump=1時發(fā)現(xiàn)跳轉(zhuǎn)到京東首頁了。 此處需要301/302跳轉(zhuǎn)根據(jù)自己需求定義祟印。
2.1肴沫、example.conf配置文件
Java代碼
location?/lua_rewrite_2?{??
default_type"text/html";??
????rewrite_by_lua_file?/usr/example/lua/test_rewrite_2.lua;??
echo"rewrite2?uri?:?$uri,?a?:?$arg_a";??
}??
2.2粟害、test_rewrite_2.lua
Java代碼
if?ngx.req.get_uri_args()["jump"]?==?"1"?then??
ngx.req.set_uri("/lua_rewrite_3",?false);??
ngx.req.set_uri("/lua_rewrite_4",?false);??
ngx.req.set_uri_args({a?=1,?b?=?2});??
end???
ngx.req.set_uri(uri, false):可以內(nèi)部重寫uri(可以帶參數(shù))蕴忆,等價于 rewrite ^ /lua_rewrite_3;通過配合if/else可以實現(xiàn)?rewrite ^ /lua_rewrite_3 break悲幅;這種功能套鹅;此處兩者都是location內(nèi)部url重寫,不會重新發(fā)起新的location匹配汰具;
ngx.req.set_uri_args:重寫請求參數(shù)卓鹿,可以是字符串(a=1&b=2)也可以是table;
訪問如http://192.168.1.2/lua_rewrite_2?jump=0時得到響應(yīng)
rewrite2 uri : /lua_rewrite_2, a :
訪問如http://192.168.1.2/lua_rewrite_2?jump=1時得到響應(yīng)
rewrite2 uri : /lua_rewrite_4, a : 1
3.1留荔、example.conf配置文件
Java代碼
location?/lua_rewrite_3?{??
default_type"text/html";??
????rewrite_by_lua_file?/usr/example/lua/test_rewrite_3.lua;??
echo"rewrite3?uri?:?$uri";??
}??
3.2吟孙、test_rewrite_3.lua
Java代碼
if?ngx.req.get_uri_args()["jump"]?==?"1"?then??
ngx.req.set_uri("/lua_rewrite_4",?true);??
ngx.log(ngx.ERR,"=========")??
ngx.req.set_uri_args({a?=1,?b?=?2});??
end??
ngx.req.set_uri(uri, true):可以內(nèi)部重寫uri,即會發(fā)起新的匹配location請求聚蝶,等價于 rewrite ^ /lua_rewrite_4 last杰妓;此處看error log是看不到我們記錄的log。
所以請求如http://192.168.1.2/lua_rewrite_3?jump=1會到新的location中得到響應(yīng)碘勉,此處沒有/lua_rewrite_4巷挥,所以匹配到/lua請求,得到類似如下的響應(yīng)
global variable : 2 , shared memory : 1 hello world
即
rewrite ^ /lua_rewrite_3; ? ? ? ? ? ? ? ? 等價于 ?ngx.req.set_uri("/lua_rewrite_3", false);
rewrite ^ /lua_rewrite_3 break; ? ? ? 等價于 ?ngx.req.set_uri("/lua_rewrite_3", false); 加 if/else判斷/break/return
rewrite ^ /lua_rewrite_4 last; ? ? ? ? ? 等價于 ?ngx.req.set_uri("/lua_rewrite_4", true);
注意验靡,在使用rewrite_by_lua時倍宾,開啟rewrite_log on;后也看不到相應(yīng)的rewrite log。
access_by_lua?
用于訪問控制胜嗓,比如我們只允許內(nèi)網(wǎng)ip訪問高职,可以使用如下形式
Java代碼
allow?????127.0.0.1;??
allow10.0.0.0/8;??
allow192.168.0.0/16;??
allow172.16.0.0/12;??
deny??????all;??
1.1、example.conf配置文件
Java代碼
location?/lua_access?{??
default_type"text/html";??
????access_by_lua_file?/usr/example/lua/test_access.lua;??
echo"access";??
}??
?1.2辞州、test_access.lua
Java代碼
if?ngx.req.get_uri_args()["token"]?~=?"123"?then??
return?ngx.exit(403)??
end??
即如果訪問如http://192.168.1.2/lua_access?token=234將得到403 Forbidden的響應(yīng)怔锌。這樣我們可以根據(jù)如cookie/用戶token來決定是否有訪問權(quán)限。
content_by_lua?
此指令之前已經(jīng)用過了孙技,此處就不講解了产禾。
另外在使用PCRE進行正則匹配時需要注意正則的寫法,具體規(guī)則請參考http://wiki.nginx.org/HttpLuaModule中的Special PCRE Sequences部分牵啦。還有其他的注意事項也請閱讀官方文檔亚情。