elasticsearch入門系列">elasticsearch入門系列
1441
2022-05-30
獲取請求參數
vim /usr/example/example.conf
location?/lua_var?{
default_type?'text/plain';
content_by_lua_block?{
ngx.say(ngx.var.arg_a)
}
}
重新加載nginx配置文件:nginx -s reload
在瀏覽器***問http://116.196.177.123/lua_var?a=323,瀏覽器顯示:
323
在上述代碼中,涉及到了2個api,一是ngx.say(直接返回請求結果);二是ngx.var,它是獲取請求的參數,例如本示例上的?a = 323,獲取之后,直接輸出為請求結果。
獲取請求類型
vim /usr/example/example.conf
location?/lua_request{
default_type?'text/html';
lua_code_cache?off;
content_by_lua_file??/usr/example/lua/lua_request.lua;
}
vim /usr/example/lua/lua_request.lua,添加一下代碼:
local?arg?=?ngx.req.get_uri_args()
for?k,v?in?pairs(arg)?do
ngx.say("[GET?]?key:",?k,?"?v:",?v)
end
ngx.req.read_body()?--?解析?body?參數之前一定要先讀取?body
local?arg?=?ngx.req.get_post_args()
for?k,v?in?pairs(arg)?do
ngx.say("[POST]?key:",?k,?"?v:",?v)
end
在上述例子中有以下的API:
·????? ngx.req.get_uri_args獲取在uri上的get類型參數,返回的是一個表類型的數據結構。
·????? ngx.req.read_body讀取body,這在解析body之前,一定要先讀取body。
·????? ngx.req.get_post_args獲取表單格式的參數,返回結果是一個表類型的數據。
使用卷曲模擬請求:
curl'http://116.196.177.123/lua_request?a=323&b=ss'-d'c = 12w&d = 2se3'
返回的結果:
[GET?]?key:b?v:ss
[GET?]?key:a?v:323
[POST]?key:d?v:2se3
[POST]?key:c?v:12w
獲取請求頭
vim /usr/example/lua/lua_request.lua,在繼承的代碼基礎上,再添加一下代碼:
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
重新加載nginx -s重新加載
使用卷曲模擬請求:
curl'http://116.196.177.123/lua_request?a=323&b=ss'-d'c = 12w&d = 2se3'
[GET?]?key:b?v:ss
[GET?]?key:a?v:323
[POST]?key:d?v:2se3
[POST]?key:c?v:12w
headers?begin
Host?:?116.196.77.157
user-agent?:?curl/7.53.0
user-agent?:?curl/7.53.0
host?:?116.196.77.157
content-type?:?application/x-www-form-urlencoded
accept?:?*/*
content-length?:?12
user-agent?:?curl/7.53.0
獲取HTTP的其他方法
vim /usr/example/lua/lua_request.lua,在繼承的代碼基礎上,再添加一下代碼:
ngx.say("ngx.req.http_version?:?",?ngx.req.http_version(),?"
")
--請求方法
ngx.say("ngx.req.get_method?:?",?ngx.req.get_method(),?"
")
--原始的請求頭內容
ngx.say("ngx.req.raw_header?:?",??ngx.req.raw_header(),?"
")
--請求的body內容體
ngx.say("ngx.req.get_body_data()?:?",?ngx.req.get_body_data(),?"
")
ngx.say("
")
重新加載nginx -s重新加載
使用卷曲模擬請求:
curl'http://116.196.177.123/lua_request?a=323&b=ss'-d'c = 12w&d = 2se3'
//....
ngx.req.http_version?:?1.1
ngx.req.get_method?:?POST
ngx.req.raw_header?:?POST?/lua_request?a=323&b=ss?HTTP/1.1
Host:?116.196.77.157
User-Agent:?curl/7.53.0
Accept:?*/*
Content-Length:?12
輸出響應
vim /usr/example/example.conf,添加一個位置,代碼如下:
location?/lua_response{
default_type?'text/html';
lua_code_cache?off;
content_by_lua_file?/usr/example/lua/lua_response.lua?;
}
vim /usr/example/lua/lua_response.lua添加一下代碼:
ngx.header.a="1"
ngx.header.b={"a","b"}
ngx.say("hello","")
ngx.print("sss")
return?ngx.exit(200)
上述代碼中有以下API:
·????? ngx.header向響應頭輸出內容
·????? ngx.say輸出響應體
·????? ngx.print輸出響應體
·????? ngx.exit指定http狀態碼退出
使用curl模擬請求,curl'http://116.196.177.123/lua_response',獲取的響應體如下:
hello
sss
日志輸出
在配置文件vim /usr/example/example.conf中添加以下代碼:
location?/lua_log{
default_type?'text/html';
lua_code_cache?off;
content_by_lua_file??/usr/example/lua/lua_log.lua;
}
vim /usr/example/lua/lua_log.lua,加上以下代碼:
local?log="i'm?log"
local?num?=10
ngx.log(ngx.ERR,?"log",log)
ngx.log(ngx.INFO,"num:"?,num)
重新加載配置文件nginx -s重新加載
卷曲'http://116.196.177.123/lua_log'
nginx的日志目錄下的error.log文件:
tail -fn 1000 /usr/servers/nginx/logs/error.log
可以看到在日志文件中已經輸出了日志,這種日志主要用于記錄和測試。
日志級別:
·????? ngx.STDERR —標準輸出
·????? ngx.EMERG —緊急報錯
·????? ngx.ALERT —報警
·????? ngx.CRIT —嚴重,系統故障,觸發運維中斷系統
·????? ngx.ERR —錯誤,業務不可恢復性錯誤
·????? ngx.WARN —植入,業務中可忽略錯誤
·????? ngx.NOTICE —提醒,業務比較重要信息
·????? ngx.INFO —信息,業務不同碎日志信息,包含不同情況判斷等
·????? ngx.DEBUG —調試
內部調用
vim /usr/example/example.conf添加以下代碼:
location?/lua_sum{
#?只允許內部調用
internal;
#?這里做了一個求和運算只是一個例子,可以在這里完成一些數據庫、
#?緩存服務器的操作,達到基礎模塊和業務邏輯分離目的
content_by_lua_block?{
local?args?=?ngx.req.get_uri_args()
ngx.say(tonumber(args.a)?+?tonumber(args.b))
}
}
internal關鍵字,表示只允許內部調用。使用curl模擬請求,請求命令如下:
$ curl'http://116.196.177.123/lua_sum?a=1&b=2'
由于該網站位置是一個內部調用的,外部不能返回,最終返回的結果為404,如下:
vim /usr/example/example.conf添加以下代碼:
location?=?/lua_sum_test?{
content_by_lua_block?{
local?res?=?ngx.location.capture("/lua_sum",?{args={a=3,?b=8}})
ngx.say("status:",?res.status,?"?response:",?res.body)
}
}
上述的代碼通過ngx.location.capture去調用內部的位置,并獲得返回結果,最終將結果輸出,采用卷曲模擬請求:
$ curl'http://116.196.177.123/lua_sum_test'
返回結果如下:
status:200?response:11
重定向
vim / usr
location?/lua_redirect{
default_type?'text/html';
content_by_lua_file??/usr/example/lua/lua_redirect.lua;
}
ngx.redirect("http://www.fangzhipeng.com",?302)
http://116.196.177.123/lua_redirect
共享內存
vim /usr/servers/nginx/cong/nginx.conf
在HTTP模塊加上以下:
lua_shared_dict?shared_data?1m;
location?/lua_shared_dict{
default_type?'text/html';
content_by_lua_file?/usr/example/lua/lua_shared_dict.lua;
}
local?shared_data?=?ngx.shared.shared_data
local?i?=?shared_data:get("i")
if?not?i?then
i?=?1
shared_data:set("i",i)
end
i?=?shared_data:incr("i",1)
ngx.say("i:",i)
多次訪問http://116.196.177.123/lua_shared_dict,瀏覽器打印:
i:1
i:2
i:3
i:4
i:5
OpenResty執行階段的概念
以下內容來自于《 openresty最佳實踐》
如上圖所示,openresty的執行階段分為
這樣我們就可以根據我們的需要,在不同的階段直接完成大部分典型處理了。
·????? set_by_lua *:流程分支處理判斷變量初始化
·????? rewrite_by_lua *:轉發,重定向,緩存等功能(例如特定請求代理到外網)
·????? access_by_lua *:IP準入,接口權限等情況集中處理(例如iptable完成簡單防火墻)
·????? content_by_lua *:內容生成
·????? header_filter_by_lua *:響應頭部過濾處理(例如添加頭部信息)
·????? body_filter_by_lua *:響應體過濾處理(例如完成應答內容統一成大寫)
執行階段概念:
·????? log_by_lua *:會話完成后本地初始完成日志記錄(日志可以記錄在本地,還可以同步到其他機器)
實際上我們只使用其中一個階段
·????? content_by_lua *,也可以完成所有的處理。但由此,變成我們的代碼比較臃腫,越到后期越發難以維護。把我們的邏輯放在不同階段,分工明確,代解碼獨立,后期發力就可以很多有意思的玩法。
·
方志朋簡介:SpringCloud中國社區聯合創始人,博客訪問量突破一千萬,愛好開源,熱愛分享,活躍于各大社區,保持著非常強的學習驅動力,終身學習踐行者,終身學習受益者。目前就職于國內某家知名互聯網保險公司,擔任DEVOPS工程師,對微服務領域和持續集成領域研究較深,精通微服務框架SpringCloud
API Nginx
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。