Nginx 日志打印之输出RequestBody

554 阅读2分钟

一、需求描述

  1. 在nginx日志中打印RequestBody。
  2. 需要打印的RequestBody可能比较大,需要进行一些处理。

二、分析需求

考虑到需要灵活打印请求体,我们在这里使用OpenResty

   OpenResty 是一个基于 Nginx 的高性能 Web 平台,集成了大量模块,并原生支持 Lua 脚本。OpenResty 提供了丰富的 API,可以处理请求体、请求头等。由于它在 Nginx 内嵌 Lua 解释器,我们也可以用 Lua 脚本编写高效的 Web 应用。

三、实施

3.1 安装OpenResty

yum install -y openresty

安装好以后,目录如下: image.png

3.2 配置OpenResty

在openResty中配置nginx。

  1. 进入nginx目录的conf目录。
  2. 编辑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;
        }
    }
}