nginx lua模块根据请求类型过滤post data/resp_body

nginx考虑到性能问题,默认是不提供将post的data以及response记录到nginx log中的,但是由于开发拍错的需要,最好的方法是将这两个经过nginx传输的字段输出出来,因此就用到了春哥开发的大名鼎鼎的nginx lua模块,编译安装的过程满大街都是,这里就不再赘述,值得注意的是如果是第一次安装lua运行环境应该是需要配置ld.conf里面的lua的lib路径。如下是nginx 配置里面不获取某个类型的回包的配置: set $resp_body “”;
set_by_lua $rtype ‘
local request_method = ngx.var.request_method
if request_method == “GET” then
local arg = ngx.req.get_uri_args()[“type”] or 0
return arg
end;
‘;
lua_need_request_body on;
body_filter_by_lua ‘
if (ngx.var.rtype == “TYPE1” or ngx.var.rtype == “TYPE2”) then
return
end

local resp_body = ngx.escape_uri(ngx.arg[1])
ngx.ctx.buffered = (ngx.ctx.buffered or “”) .. resp_body
if ngx.arg[2] then
ngx.var.resp_body = ngx.ctx.buffered
end
‘;
set_by_lua $rtype的意思是调用后面的lua脚本return 结果赋值给rtype变量。之后的lua_need_request_body on;因为nginx默认是不会读取client的request body的,这里需要将post的data打出来所以这里打开,打开之后就可以通过使用$request_body将请求的数据输出出来。body_filter_by_lua 会调用之后定义的方法处理数据,传入的arg1是传输的数据比如这里的话就是response_body,arg2就是数据是否到了eof,他会在nginx像下游模块传输数据之前处理,这里的话就是首先根据获取到的请求类型是否继续处理,如果不是TYPE1,还有TYPE2那样的话就继续走下面处理,首先会escape处理response_body并赋值给resp_body之后将字符串拼接赋值给nginx的上下文中的buffer中,当遇到eof的时候就将buffer变量赋值给resp_body中,之后就可以在nginx配置中将resp_body输出到nginx的access log中了。

值得注意的是,好像nginx.var在获取变量的时候是有限制的不能自己随便定义变量,只能使用它其中已有的。