nginx利用request_body记录POST body(location中用proxy_pass)
1.完整过程
1.1 在nginx.conf
中http
里面添加配置如下:
http {
...
log_format postdata escape=json '$remote_addr - $remote_user [$time_local] "$request"
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
upstream bk_server {
server 127.0.0.1:12345;
}
server {
listen 12345;
location / {
proxy_pass http://bk_server/test;
access_log /var/log/nginx/post.log postdata;
}
location /test {
return 202;
}
}
...
}
检查nginx配置语法有无错误
nginx -t
若无语法错误,则reload nginx配置,使最新的nginx配置生效
nginx -s reload
1.2 使用curl命令模拟post请求
curl -i -d "arg1=1&arg2=2&hi=你好" "http://127.0.0.1:12345"
查看日记:
tail -n 10 /var/log/nginx/post.log
得到结果:
...省略其他参数的值... "arg1=1&arg2=2&hi=你好"
如果nginx装在公网服务器上,那么请将
127.0.0.1
换成公网ip
2.说明
2.1 log_format配置
log_format官方文档
log_format 语法:
log_format name [escape=default|json|none] string ...;
postdata
: 名称escape=json
: 在配置日志格式时加上此参数可以不转义变量内容,这里为了显示POST body里面的中文。(escape参数,到版本1.11.8才有,escape参数的none
值到1.13.10版本才有)$request_body
: 只有location中用到proxy_pass,fastcgi_pass,scgi_pass命令时,该变量才有值。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.
2.1.1
test
2.2 bk_server
bk_server是为了使用proxy_pass
而设置的。
3.显示HTTPS里面的POST body(可选)
如网站已使用HTTPS,那么配置如下:
3.1 除了需要把access_log那一行注释掉之外,步骤1中的配置不变。
3.2 其他配置如下
server {
# Redirect all http requests to https.
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.your_domain your_domain;
...
# Record POST body
location /post {
proxy_pass http://127.0.0.1:12345;
access_log /var/log/nginx/post.log postdata; #这里设置之后,需要把步骤1里面的access_log那一行注释掉
}
...
}
检查nginx配置语法有无错误
nginx -t
若无语法错误,则reload nginx配置,使最新的nginx配置生效
nginx -s reload
使用curl命令模拟post请求
curl -i -d "arg1=1&arg2=2&hi=你好" "https://your_domain/post"
查看日记:
tail -n 10 /var/log/nginx/post.log
得到结果:
...省略其他参数的值... "arg1=1&arg2=2&hi=你好"