Nginx Log Post: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показаны 4 промежуточные версии этого же участника)
Строка 15: Строка 15:
 
' [REQUEST BODY]: $request_body';
 
' [REQUEST BODY]: $request_body';
 
</PRE>
 
</PRE>
  +
  +
Если получен пустой $request_body то это означает что (в одном из случаев) nginx посчтал что ему не нужно разбирать запрос.<BR>
  +
В этом случае можно прибегнуть к трюку с проксированием на самого себя
  +
<PRE>
  +
server {
  +
listen 25001 default_server;
  +
root /var/www/html;
  +
server_name _;
  +
access_log /var/log/nginx/github-to-jenkins-proxy-access.log postdata;
  +
error_log /var/log/nginx/github-to-jenkins-proxy-error.log;
  +
  +
  +
location /webhook {
  +
client_body_buffer_size 64k;
  +
client_body_in_single_buffer on;
  +
proxy_pass http://127.0.0.1:25001/real-webhook;
  +
}
  +
  +
  +
location /real-webhook {
  +
client_body_buffer_size 64k;
  +
client_body_in_single_buffer on;
  +
return 200 $request_body;
  +
}
  +
  +
  +
}
  +
</PRE>
  +
  +
<B>Возможно нужно бужет покрутить client_body_buffer_size 64k;</B>
  +
<BR>
  +
Но после добавления директивы access_log в нужное место произошло странное — часть запросов логировалась нормально, <BR>
  +
а для части из них $request_body оказывался пустым. Дело оказалось в том, что NGINX сохраняет в переменную $request_body <BR>
  +
только запросы ограниченной длины, по умолчанию 8 или 16 кб. Для более тяжёлых запросов не сохраняется ничего.
  +
* https://mkhl.brnv.ru/how-to-log-request-body-in-nginx/
   
 
=Логгирование ответа от backend/upstream=
 
=Логгирование ответа от backend/upstream=
 
Иногода (обычно для дебага) нужно логгировать не только запросы но и ответы от бекенда
 
Иногода (обычно для дебага) нужно логгировать не только запросы но и ответы от бекенда
 
<BR>Сделать это на "голом" nginx у меня не получилось - только используя Lua.
 
<BR>Сделать это на "голом" nginx у меня не получилось - только используя Lua.
<BR>Другими словами в некоторых сборках обрадов докер может потребоваться замена версии nginx (OpenResty).
+
<BR>Другими словами в некоторых сборках docker images может потребоваться замена версии nginx (OpenResty).
   
 
<PRE>
 
<PRE>

Текущая версия на 11:39, 17 февраля 2022


Nginx Log POST

Иногдя нужно логгирировать (обычно для дебага) что отправляют через POST

Вот пример

    log_format postdata escape=json '"$request" $status'
                                    ' [REQUEST BODY]: $request_body';

Если получен пустой $request_body то это означает что (в одном из случаев) nginx посчтал что ему не нужно разбирать запрос.
В этом случае можно прибегнуть к трюку с проксированием на самого себя

server {
        listen 25001 default_server;
        root /var/www/html;
        server_name _;
        access_log /var/log/nginx/github-to-jenkins-proxy-access.log postdata;
        error_log /var/log/nginx/github-to-jenkins-proxy-error.log;


        location /webhook {
            client_body_buffer_size 64k;
            client_body_in_single_buffer on;
            proxy_pass http://127.0.0.1:25001/real-webhook;
        }


        location /real-webhook {
            client_body_buffer_size 64k;
            client_body_in_single_buffer on;
            return  200 $request_body;
        }


}

Возможно нужно бужет покрутить client_body_buffer_size 64k;
Но после добавления директивы access_log в нужное место произошло странное — часть запросов логировалась нормально,
а для части из них $request_body оказывался пустым. Дело оказалось в том, что NGINX сохраняет в переменную $request_body
только запросы ограниченной длины, по умолчанию 8 или 16 кб. Для более тяжёлых запросов не сохраняется ничего.

Логгирование ответа от backend/upstream

Иногода (обычно для дебага) нужно логгировать не только запросы но и ответы от бекенда
Сделать это на "голом" nginx у меня не получилось - только используя Lua.
Другими словами в некоторых сборках docker images может потребоваться замена версии nginx (OpenResty).

http {
  ...
  log_format bodylog '$remote_addr - $remote_user [$time_local] '
      '"$request" $status $body_bytes_sent '
      '"$http_referer" "$http_user_agent" $request_time '
      '<"$request_body" >"$resp_body"';

  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
  ';
...
}
server {
  listen 1.2.3.4;
 
  location / {
    proxy_pass http://127.0.0.1:3000;
    access_log  /var/log/nginx/server.log bodylog;
  }