Uninote
Uninote

实例说明

  • 开发调试时,需要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模块实现

#安装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

最终的展示效果如下图:

附:

nginx学习汇总

nginx请求头分流

点赞(0) 阅读(1) 举报
目录
标题