一、需求描述
- 在nginx日志中打印RequestBody。
- 需要打印的RequestBody可能比较大,需要进行一些处理。
二、分析需求
考虑到需要灵活打印请求体,我们在这里使用OpenResty。
OpenResty 是一个基于 Nginx 的高性能 Web 平台,集成了大量模块,并原生支持 Lua 脚本。OpenResty 提供了丰富的 API,可以处理请求体、请求头等。由于它在 Nginx 内嵌 Lua 解释器,我们也可以用 Lua 脚本编写高效的 Web 应用。
三、实施
3.1 安装OpenResty
yum install -y openresty
安装好以后,目录如下:
3.2 配置OpenResty
在openResty中配置nginx。
- 进入nginx目录的conf目录。
- 编辑nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
client_body_buffer_size 10M; # 增加客户端请求体缓冲区大小
proxy_buffers 16 32k; # 增加代理缓冲区数量和大小
proxy_buffer_size 64k; # 增加代理缓冲区大小
proxy_max_temp_file_size 100M; # 设置代理最大临时文件大小
proxy_temp_file_write_size 64k; # 设置代理临时文件写入大小
large_client_header_buffers 4 16k; # 设置大请求头缓冲区数量和大小
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#lua 模块
lua_package_path "/usr/local/openresty/lualib/?.lua;;";
##c模块
lua_package_cpath "/usr/local/openresty/lualib/?.so;;";
server {
listen 8001;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
add_header 'Access-Control-Allow-Origin' '*';
root html;
index index.html index.htm;
}
location /demo{
access_log /usr/local/openresty/nginx/logs/postdata.log;
# 读取请求体
client_max_body_size 100M;
client_body_buffer_size 2048k;
client_body_in_single_buffer on;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET,POST,PUT,PATCH,DELETE,OPTIONS';
add_header Access-Control-Allow-Headers 'authorization, origin, content-type, accept,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control';
default_type application/json;
content_by_lua_block{
ngx.req.read_body()
local body = ngx.req.get_body_data()
if body then
for i = 1, #body, 3000 do
ngx.log(ngx.ERR, body:sub(i, i + 2999))
end
end
ngx.say("Successfully.")
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}