Настройка nginx на CentOS7

Возможность логирования реквеста и респонса

Posted by kxxb on September 24, 2020

Возникла задача логировать всё, что приходит на сервак и ответ. Для этого необходимо воспользоваться настройкой nginx и nginx_lua

В конечном виде, лог выглядиит вот так:

root@queen♕ # tail -f api1-access.log
  >>>>90.118.76.65 -  [24/Sep/2020:13:47:37 +0300]
  HTTP_STATUS: "200"  BODY_BYTES_SENT: "96"
  HTTP_REFER:""
  AGENT:"" REQUEST_TIME: "0.298"
  REQUEST_BODY:
  <"">
  REQUEST: >>>
   "GET /MqttPlatform/emq/addressVeh?usr=onthefly&pw=pasw&bleMAC=90:50:D9:1A:66:F6 HTTP/1.1"
  RESPONSE: <<<
   "{"s":true,"u":"90:50:D9:1A:66:F6","h":"domain.com","p":"20210","t":1600944457}"
            

Для этого, необходимо в конфиге nginx в файле nginx.conf сделать следующие изменения

  user  nginx;
  worker_processes  1;

  error_log  /var/log/nginx/error.log warn;
  pid        /var/run/nginx.pid;

  load_module     modules/ndk_http_module.so;
  load_module     modules/ngx_http_lua_module.so;


  events {
      worker_connections  1024;
  }


  http {
      include	  /etc/nginx/mime.types;
      default_type  application/octet-stream;

      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  /var/log/nginx/access.log  main;


         log_format bodylog escape=none '\n>>>>$remote_addr - $remote_user [$time_local] '
            '\nHTTP_STATUS: "$status"  BODY_BYTES_SENT: "$body_bytes_sent" '
            '\nHTTP_REFER:"$http_referer"'
            '\nAGENT:"$http_user_agent" REQUEST_TIME: "$request_time"'
            '\nREQUEST_BODY:\n<"$request_body">'
            '\nREQUEST: >>>\n "$request"'
            '\nRESPONSE: <<< \n "$resp_body"';

          lua_need_request_body on;


          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
  	';

  server {
    listen 80 default_server;
    set $resp_body "";

    location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $http_host;
  proxy_redirect off;
  proxy_pass http://127.0.0.1:3000;
  access_log  /var/log/nginx/server.log bodylog;
}
}

  sendfile        on;
  #tcp_nopush     on;

  keepalive_timeout  65;

  #gzip  on;

  include /etc/nginx/conf.d/*.conf;
}

Стоит обратить внимание на флаг lua_need_request_body. Для него необходимо установить, две либы
luajit-2.0.4-3.el7.x86_64
luajit-devel-2.0.4-3.el7.x86_64

Установка модулей

В чате nginx_ru один из участников скомпилировал модули
1. Скачиваете модуль в /etc/nginx/modules/
2. Пишете в конфиге

load_module     modules/ngx_http_lua_module.so ;
Смотрите nginx -t

Photos NASA on The Commons.