实例说明
- 开发调试时,需要nginx日志输出里面有比较详细的日志
- 日志中需要包含请求头、响应头、响应主体等信息
尝试一:使用nginx自带日志模块
- nginx自带输出格式
#http模块的内容如下:
#以下日志格式中,使用的变量和含义可以参考上面内部变量
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#在响应的模块下(server、location、或http)的配置如下:
#main就是上面定义的日志格式
access_log logs/access.log main;
尝试一的总结: - 日志可以输出:请求客户端地址,请求的uri,请求的时间,请求头、主体的长度,客户端标识,请求数,响应头、主体长度,协议,状态码等信息。但无法获取请求和转发的请求头、响应头详细内容,无法直观调试。
尝试二: 使用ngx_lua模块实现
- 1. nginx安装ngx_lua模块参考文档
- 2. ngx_lua模块定义日志输出header和body
- 成功在nginx上编译ngx-lua模块的范例步骤:
#安装luajit
wget -c http://luajit.org/download/LuaJIT-2.0.2.tar.gz
tar xzvf LuaJIT-2.0.2.tar.gz
cd LuaJIT-2.0.2
make install PREFIX=/usr/local/luajit
echo "/usr/local/luajit/lib" > /etc/ld.so.conf.d/usr_local_luajit_lib.conf
ldconfig
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0
#下载kit模块和lua-module
wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz
tar xf v0.3.0.tar.gz
tar xf v0.10.9rc7.tar.gz
#安装nginx
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar xf nginx-1.18.0.tar.gz
cd nginx-1.18.0
./configure --prefix=/opt/nginx-1.18.0 --add-module=../ngx_devel_kit-0.3.0/ --add-module=../lua-nginx-module-0.10.9rc7/ --with-pcre
make && make install
#配置nginx中的http模块----定义logformat
log_format json_log '{ "request_time:" "$time_local",\n'
'"request_uri:" "$request",\n'
'"http_code:" "$status",\n'
'"req_header:" "$req_header",\n'
'"req_body:" "$request_body",\n'
'"resp_header:" "$resp_header",\n'
'"resp_body:" $resp_body"'
' }';
#nginx中location模块的配置
location / {
#请求响应头部
#定义了两个变量
set $req_header "";
set $resp_header "";
#下面是用lua语言编写的两段循环,获取请求头和响应头内容
header_filter_by_lua '
local h1 = ngx.req.get_headers()
for k1, v1 in pairs(h1) do
ngx.var.req_header=ngx.var.req_header..k1..": "..v1
end
local h = ngx.resp.get_headers()
for k, v in pairs(h) do
ngx.var.resp_header=ngx.var.resp_header..k..": "..v
end
';
lua_need_request_body on;
#响应主体
set $resp_body "";
body_filter_by_lua '
local resp_body = string.sub(ngx.arg[1], 1, 1000)
ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body
if ngx.arg[2] then
ngx.var.resp_body = ngx.ctx.buffered
end
';
root html;
index index.html;
#定义日志格式为上面http模块中定义的json_log格式
access_log logs/access.log json_log;
}
#额外配置,防火墙开放80端口
firewall-cmd --add-port=80/tcp --zone=public --permanent
最终的展示效果如下图: