nginx记录post body/payload数据

1. 文档

在nginx中想利用$request_body命令获取post请求的body参数,并落日志,但是发现该变量值为空,查看官网中对$request_body的描述如下:

$request_body
    request body

The variable’s value is made available in locations processed by the proxy_pass, fastcgi_pass, uwsgi_pass, and scgi_pass directives when the request body was read to a memory buffer.

意思是只有location中用到proxy_pass,fastcgi_pass,scgi_pass命令时,该变量才有值。

2.使用proxy_pass,fastcgi_pass, scgi_pass等命令获取$request_body值

试了下用proxy_pass,的确可以。配置如下:

log_format main_post ‘$remote_addr\t$remote_user\t[$time_local]\t"$request"\t$status\t$bytes_sent\t‘
                ‘"$http_referer"\t"$http_user_agent"\t"$http_x_forwarded_for"\t"$request_body"‘;
worker_processes  1;        #nginx worker 数量
error_log logs/error.log;   #指定错误日志文件路径
events {
    worker_connections 1024;
}

http {
    log_format  dm  ‘ "$request_body" ‘;

    upstream bk_servers_2 {
        server 127.0.0.1:6699;
    }

    server {
        listen 6699;
        location /post/ {
            proxy_pass http://bk_servers_2/api/log/letv/env;
            access_log /home/shuhao/openresty-test/logs/post.log dm;
        }
        location /api/log/letv/env {
            return 202;
        }
    }
}

使用curl命令模拟post请求

curl -i  -d "arg1=1&arg2=2" "http://127.0.0.1:6699/post/"
 "arg1=1&arg2=2" 

3.使用lua获取$request_body值

条件:使用openresty或者nginx编译了lua模块。

方法:

server中使用lua_need_request_body on; 或者在location lua代码块中使用 ngx.req.read_body()

注意:

1)lua代码块中必须有执行语句,否则lua不执行,无法获取request_body;

2)不要使用return 200;等命令,有return命令,lua代码不执行。

worker_processes  4;        #nginx worker 数量
error_log ~/openresty-test/logs/error.log debug;   #指定错误日志文件路径
events {
    worker_connections 1024;
}

http {
    log_format  dm  ‘"$request_body"‘;
    lua_need_request_body on;
    server {
        listen 6699;
        location /post/ {
            content_by_lua ‘
                ngx.say("-------")
                ngx.req.read_body()
            ‘;
            access_log ~/openresty-test/logs/post.log dm;
            #return 200;
        }
    }
}

4. 自定义变量存放request body

方法:

1)在server 块中使用set $resp_body ""; 声明变量;

2)在location使用  ngx.var.resp_body = ngx.req.get_body_data() or "-"    为变量赋值

worker_processes  1;        #nginx worker 数量
error_log /home/shuhao/openresty-test/logs/error.log debug;   #指定错误日志文件路径
events {
    worker_connections 1024;
}

http {
    log_format  dm  ‘ "$request_body"  --  "$resp_body"‘;
    lua_need_request_body on;
    server {
        listen 6699;
        set $resp_body "";
        location /post/ {
            lua_need_request_body on;
            content_by_lua ‘
                local resp_body = ngx.req.get_body_data() or "-"
                ngx.var.resp_body = resp_body
            ‘;
            access_log /home/shuhao/openresty-test/logs/post.log dm;
            #return 200;
        }
    }
}

效果:

(完)

原文地址:https://www.cnblogs.com/sunsky303/p/9583550.html

时间: 2024-10-10 12:58:05

nginx记录post body/payload数据的相关文章

nginx服务器代理获取接口数据

自从学会用nginx服务器代理抓取数据,妈妈再也不用担心我写DEMO时拿不到数据了,从此你也摆脱了自己造数据的烦恼.哇!又出新框架了,走,写个DEMO练习去,那我们用React.JS仿制个淘宝出来吧,淘宝数据怎么办???so easy , 直接去抓取接口数据就可以了. 一.下载nginx服务器 去nginx官网下载nginx服务器,我们就下载nginx/Windows-1.8.1 pgp 这个吧! 二.配置环境 1. 将下载的压缩包解压后获得如下图所示的文件夹: 2.打开conf文件夹并打开ng

记录一个读pcap数据包的软件:Fiddler

Fiddler.大神推荐的.名字老忘. 用wireshark在wifi共享精灵共享出来的无线网上抓包,发现一个SSDP(简单服务发现协议)一直在尝试找连上这个网络上的设备. 连上NEXUS4后出现了ICMPv6( Internet Control Message Protocol,错误侦测,维护路由)以及DHCP.TCP的一些信息. 记录一个读pcap数据包的软件:Fiddler

nginx记录post数据日志

1.vi nginx.conf 找到http {}中log_foramt ,定义post 日志格式 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'

nginx记录分析网站响应慢的请求(ngx_http_log_request_speed)

nginx模块ngx_http_log_request_speed可以用来找出网站哪些请求很慢,针对站点很多,文件以及请求很多想找出哪些请求比较慢的话,这个插件非常有效.作者的初衷是写给自己用的,用来找出站点中处理时间较长的请求, 这些请求是造成服务器高负载的很大根源. 日志记录之后,在使用perl脚本分析日志,即可知道哪些请求需要修正. 1. 模块安装 nginx第三方模块安装方法,我们ttlsa.com已经说过很多次了,我这边不在重复了.配置参数 1 2 ./configure --pref

jqgrid 记录翻页选中数据

项目中有试使用jqGrid 进行数据展示,最近需要完成一个功能 记录用户翻页前选中的数据.如: 目前的分页实现是根据条件加载当前页,前一页的数据并未进行保存,查询API发现没有直接提供处理方法.但API有提供相关处理方法,通过修改能够很容易实现此功能. 实现该功能主要依赖于API提供的三个方法.loadComplete,onSelectAll,onSelectRow     方法名     参数                                          功能 loadCo

nginx源码解析之数据结构篇

在上一篇分析nginx内存池的基础上,回过头来看看nginx中一些常见的数据结构,如字符串.数组.队列.链表.hash表等. 字符串 nginx字符串的实现代码在core/ngx_string.{h,c},里面除了字符串定义之外,还包括很多辅助函数,有字符串拷贝.格式化.转换及编码等.以下是字符串结构的定义,实际上就是在字符指针的基础上加了个长度字段,意味着可以用来表示二进制的数据. typedef struct { size_t len; u_char *data; } ngx_str_t;

nginx记录真是的IP地址 <备忘>

nginx.haproxy等作为代理服务器时,要使后端web服务器记录真是的IP地址,需要配置: location / {     proxy_set_header    Host    $host;     proxy_set_header    X-Real-IP    $remote_addr;     proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;     proxy_buffering    off;

Nginx记录post body内容

nginx在记录http的body内容时,会将中文转义为16进制 在nginx 1.11.8 以上版本中log_format 增加了escape=json 参数,可以不转义变量内容: log_format access escape=json '$request_time $remote_addr "$request" "$request_body" $status "$http_referer" "$http_user_agent&q

nginx记录实时请求状态

cd /opt wget https://github.com/magicbear/ngx_realtime_request_module/archive/master.zip -O ngx_realtime_request.zip unzip ngx_realtime_request.zip nginx -V                         ##查看nginx编译参数 cd /opt/lnmp/nginx-1.1.10/ ./configure  --user=www --gr