nginx将POST数据写到日志里
NGINX 是一个强大的web服务器,可以很容易的应对高负载的HTTP流量。nginx每处理一个连接,就会记录一条日志信息,包括诸如:IP地址,回复内容大小、http状态码等信息。
某种情况下,需要了解请求内容是什么,特别 POST 请求。 NGINX 默认只支持记录GET请求,对于记录POST请求需要使用额外的模块,例如, Echo module, 这个模块提供很多有用的指令: echo
, time
, and sleep
。
记录POST请求我们需要使用到其中的 echo_read_request_body
命令和 $request_body
变量。
源码编译nginx增加echo模块步骤:
1.下载nginx和echo模块的源码:
1 2 3 4 5 6 7 8 |
curl -L -O 'https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz' tar -xzvf v0.61.tar.gz && rm -f v0.61.tar.gz mv echo-nginx-module-0.61 /tmp/echo-nginx-module wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz tar -zxvf openssl-1.1.1g.tar.gz && openssl-1.1.1g.tar.gz mv openssl-1.1.1g /tmp/openssl-1.1.1g curl -O 'http://nginx.org/download/nginx-1.18.0.tar.gz' tar -xzvf nginx-1.18.0.tar.gz && rm -f nginx-1.18.0.tar.gz |
2.创建 nginx
用户, 用来运行nginx进程:
1 2 |
groupadd nginx useradd -g nginx nginx |
3.从源码编译安装nginx:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
cd nginx-1.18.0/ && ./configure \ --user=nginx \ --group=nginx \ --prefix=/usr/local/nginx \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-pcre \ --with-file-aio \ --with-http_realip_module \ --with-openssl=/tmp/openssl-1.1.1g \ --add-module=/tmp/echo-nginx-module make -j2 make install |
现在,nginx已安装完成,可以启动了。启动之前我们需要修改nginx的默认配置文件 /usr/local/nginx/conf/nginx.conf 来记录 HTTP request body 到日志文件。
NGINX 使用 access_log 指令记录多种 HTTP 请求相关的信息,哪些信息会或不会被记录则通过 log_format 指令来设置。Echo 模块通过调用 echo_read_request_body 方法存储 request body 到 request_body 变量中。为了记录 POST 请求体需要在配置文件中修改这些指令:
1 2 3 4 5 6 7 8 9 10 11 12 |
http { ... log_format custom '$request_body'; access_log logs/access.log custom; ... server { location / { echo_read_request_body; ... } } } |
如果你的系统负载很高,你可以通过提高Linux打开文件数参数的大小来提高 NGINX 的处理能力。通过如下指令增加配置到文件末尾或直接修改相应的配置文件。
1 2 3 |
echo "fs.file-max = 1073741824" >> /etc/sysctl.conf echo "nginx soft nofile 40960" >> /etc/security/limits.conf echo "nginx hard nofile 81920" >> /etc/security/limits.conf |
终于可以启动nginx并记录POST的请求内容了,运行nginx命令:
1 |
/usr/local/nginx/sbin/nginx |
测试
修改配置文件增加上面提到的三个配置。
[root@67 nginx]# cd /usr/local/nginx/conf/
[root@67 conf]# vi nginx.conf
测试并重新加载配置文件
[root@67 conf]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@67 conf]# /usr/local/nginx/sbin/nginx -s reload
不带post参数会记录一个短横
[root@67 conf]# curl 127.0.0.1
[root@67 conf]# curl 127.0.0.1
[root@67 conf]# cd ../logs/
[root@67 logs]# tail -f access.log
-
-
[root@67 logs]# curl -d "site=redis.com.cn" 127.0.0.1
[root@67 logs]# tail -f access.log
-
-
site=redis.com.cn
排错
1.
checking for getaddrinfo() ... found
configuring additional modules
adding module in /tmp/echo-nginx-module
/tmp/echo-nginx-module/config: line 41: [: !=: unary operator expected
+ ngx_http_echo_module was configured
checking for PCRE library ... not found
checking for PCRE library in /usr/local/ ... not found
checking for PCRE library in /usr/include/pcre/ ... not found
checking for PCRE library in /usr/pkg/ ... not found
checking for PCRE library in /opt/local/ ... not found
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
缺少PCRE、ZLIB参考nginx安装教程先安装对应的源码包
2.
checking for OpenSSL library ... not found
checking for OpenSSL library in /usr/local/ ... not found
checking for OpenSSL library in /usr/pkg/ ... not found
checking for OpenSSL library in /opt/local/ ... not found
需要下载opensll包,参考nginx安装
cd /tmp
wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
tar -zxvf openssl-1.1.1g.tar.gz
--with-openssl=/tmp/openssl-1.1.1g
总结,本文主要介绍了如果配置nginx的日志记录功能,以及如何编译、安装、和使用echo模块。
参考:developers.redhat.com/blog/2016/05/23/configuring-nginx-to-log-post-data-on-linux-rhel/
看完了,作者很棒棒