nginx 怎么记录post请求数据日志?windows下的环境,需要记录的接口和nginx都在win下,现在想日志能记录下post提交过来的数据,按照网上的方法都无效。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
使用过ngx_lua的方式 记录请求信息 以及响应信息 首先 nginx 是不会读取http请求的body的 ,下面说明的 是我所知道的一个办法 存手打 代码有部分复制我写的。。 首先用lua在nginx内部的做一个小代理转发
location / { content_by_lua_block { local method_name = ngx.req.get_method() -- 获得请求方法 local get_uri_args = ngx.req.get_uri_args -- 获得get参数的方法 local args = get_uri_args() -- 获得get参数 local res if method_name == 'GET' then res = ngx.location.capture('/sub', {method = ngx.GET, ['args'] = args, ctx = {myuri = ngx.var.uri, my_remote_addr = ngx.var.remote_addr}}) elseif method_name == 'POST' or method_name == 'PUT' then ngx.req.read_body() -- 读取请求body res = ngx.location.capture('/sub', {always_forward_body = true, ['args'] = args, ctx = {myuri = ngx.var.uri, my_remote_addr = ngx.var.remote_addr}}) end -- 这是子请求返回的header local header = res.header -- 设置响应header for key in pairs(header) do ngx.header[key] = header[key] end -- 下面两个函数方法可以获得post参数 https://github.com/openresty/lua-nginx-module 这个地址有更详细的文档 文档里面提供了可以操作数据库等方法 你可以用做存储数据 -- ngx.req.get_body_data() -- post 参数 这个值都是字符串 存在\r\n这些 -- ngx.req.get_post_args() -- 或者这个方法 但是 需要注意的是 MIME type 需要 application/x-www-form-urlencoded
ngx.status = res.status -- 设置状态码 跟子请求一样 ngx.say(res.body) -- 输出子请求的响应body ngx.exit( res.status) } }
location = /sub { internal; set_by_lua_block $myuri { return ngx.ctx.myuri } set_by_lua_block $my_remote_addr { return ngx.ctx.my_remote_addr } try_files $myuri $myuri/ /index.php?$query_string; } 如果你只想要记录post的请求话 可以不用的上面的子请求方式 // 其实记录响应信息也可以不用。。 但是我做的时候太麻烦了 线上没用 我就没贴出来 下面的只记录就请求信息的方式简介 在log_by_lua_* 阶段 也可以获取请求信息并且记录 在nginx配置文件中添加 lua_need_request_body on; # 具体原因 https://github.com/iresty/nginx-lua-module-zh-wiki#lua_need_request_body 查看 location / { log_by_lua_block { -- ngx.req.get_body_data() -- post 参数 这个值都是字符串 存在\r\n这些 -- ngx.req.get_post_args() -- 或者这个方法 但是 需要注意的是 MIME type 需要 application/x-www-form-urlencoded
} } 但是需要注意 log_by_log 阶段无法使用socket相关的API 所以无法插入数据库等操作 所以可以用几种思路来 1、 https://github.com/p0pr0ck5/lua-resty-logger-socket 具体使用看这个文档 2、 我使用的是把信息保存在ngx_lua 的全局共享内存中 操作方式类似redis,然后在其他阶段执行, 具体使用API还是可以看文档 最后你使用的是windows 所以可以使用已经打包好的openresty win版 https://openresty.org/download/openresty-1.13.6.1-win32.zip openresty 其实使用起来跟nginx是一样的 ######你不说大家怎么知道你试过哪些方法....######通过lua的方式获取到了记录,但是不知道怎么返回的数据突然就有问题了,提示返回参数错误######你的现象说的不具体啊 很难帮你想