首先你的環(huán)境需要支持:
- nginx-lua
- json.lua
- lua-resty-kafka (如將流量打至kafka則需安裝此包)
- lua-resty-upload
簡單將流量采集分為3個模塊:
- 請求數(shù)據(jù)包獲取
- 響應(yīng)數(shù)據(jù)包獲取
- 攔截模塊
0x01 請求數(shù)據(jù)包獲取
這部分比較簡單龟再,基本信息都在ngx.var ngx.ctx 等中都可以獲取到:
ngx.status #狀態(tài)碼
ngx.var.scheme #協(xié)議
ngx.var.request_method # 請求方法
ngx.var.request_uri #請求uri
ngx.var.host #請求域名host
ngx.var.remote_addr #請求方IP
ngx.var.hostname #主機(jī)hostname
ngx.var.time_iso8601 #時(shí)間
ngx.var.server_port #服務(wù)端端口
ngx.req.get_headers() #獲取請求頭
ngx.req.get_body_data() #獲取請求體
此處需注意get_headers 和 get_body_data 均需轉(zhuǎn)換成dict形式夸研。
0x02 響應(yīng)數(shù)據(jù)包獲取
響應(yīng)體獲取不是直接ngx.resp.get_headers()之類可以獲取到的茬底,需做一些處理:
resp_body = string.sub(ngx.arg[1],1,10000)
//此處代表截取前1w字符
ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body
if ngx.arg[2] then
ngx.var.resp_body = ngx.ctx.buffered
end
ngx.ctx.buffered 即為響應(yīng)體內(nèi)容
需配合 header_filter_by_lua_file 引用
local h = ngx.resp.get_headers()
local r = {}
for k, v in pairs(h) do
r[k]=v
end
ngx.ctx.resp_headers = r
ngx.ctx.resp_headers 即為響應(yīng)頭信息
需配合 body_filter_by_lua_file 引用
0x03 簡單攔截
以下為對內(nèi)容進(jìn)行簡單攔截缅叠。
local post_data = ""
if ngx.req.get_body_data()~=nil then
post_data = ngx.req.get_body_data()
end
local get_data = ""
if ngx.var.request_uri~=nil then
get_data = ngx.var.request_uri
end
if string.match(get_data,"@type") then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
if string.match(post_data,"@type") then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
待更新高級用法妙黍。