nginx 记录response body

原创
2022/10/09 17:58
阅读数 533

  很多时候技术人员排查问题时都需要日志,越是详细的日志内容,则会更加快速定位问题原因。nginx目前的日志已经很全面了,只需要按需打开记录即可。像post提交的日志默认是没有记录的,如果需要打开添加 $request_body变量即可。

log_format  main  escape=json '$remote_addr - $remote_user [$time_local] "$request" " 
                 [$request_body]" "[$response_body]" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';

切记不要忘记加上escape=json 不然的话会出现在十六进制字符 x22, nginx 1.11.8 才加入的功能,下图对比两者的区别。

当我们想记录response_body时,nginx是不支持的,因为response_body内容有时很大,且没有规则,一般做联调时的场景用到的多,就是client 端post提交参数request_body后,服务端响应的内容就是response_body  。此时需要添加三方模块  --add-module=/root/ngx_http_response_body_module 重新编译nginx 即可。本人测试时版本nginx/1.23.0 目前是兼容的。

 随后编辑nginx.conf 如下

http {
 ......... 
 log_format  main  escape=json '$remote_addr - $remote_user [$time_local] "$request" " 
                 [$request_body]" "[$response_body]" '
                '$status $body_bytes_sent "$http_referer" '
                 '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  logs/access.log  main;

         map $status $cond {
                301       0;
                default   1;
        }

        capture_response_body                   on;
        capture_response_body_buffer_size       1m;
        capture_response_body_buffer_size_min   4k;
        capture_response_body_buffer_size_multiplier   2;
        capture_response_body_if                $cond 1;
        capture_response_body_if_latency_more   1s;
.........

 

301状态以外的response_body全部记录,使用场景很多,比如调试、账密防止爆力破解(与fail2ban结合)再比如只记录500,502,504错误时,后端到底响应了什么内容。

查看access.log已经记录了response_body内容。如果是序列化的body,则无法识别内容。

序列化的body,再没有反序列化时,不能识别的情况,如下

 

至于为何要序列化,是为了跨平台存储和网络传输,要知道如果要将内存中的数据持久化,就需要序列化才能存储,我们知道通过网络传输时,可以用字符串和二进制两种方式,但是传文件就要通过序列化转换成二进制字节码后以流形式再传,接收方则需要反序列化,重组数据从而得到原始数据。而不同的编程语言实现的序列化方式也不同。所以nginx 也无法显示序列化之前的内容。

最后,其实序列化是可以加强报文的安全性的,至少截获了报文是看不到原始数据的。

展开阅读全文
加载中
点击加入讨论🔥(1) 发布并加入讨论🔥
打赏
1 评论
0 收藏
0
分享
返回顶部
顶部