The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
nginx не логирует тело POST запроса, !*! novichok, 04-Апр-19, 21:13  [смотреть все]
Здравствуйте.
Прошу помочь и ткнуть носом в ошибку, четвертый вечер гуглю, доки на оф сайте читал, много всего перепробовал, но результат нулевой.

Надо писать в лог тело POST запроса пришедшего в nginx.
Можно не заморачиваться и использовать ngrep, но это крайний вариант.

В nginx полный ноль, только начинаю его изучать.

имею установленный по дефолту nginx( apt-get install nginx) в debian_9

вот что добавил в конфиг:
------------------------
      log_format postdata escape=json ' "$request" $status'
                                        ' [REQEUST BODY]: [$request_body] ';


        server {

        listen 127.0.0.1:80 default_server;
        server_name localhost;

        location / {
        access_log /var/log/nginx/access.log postdata;
        }
        }
------------------------
отправляю пост:
curl -H "Content-Type: application/json" -X POST -d '{"user":"bob","pass":"123"}' http://localhost

получаю в ответ ошибку 405 Not Allowed.

в лог пишется:
::1 - - [04/Apr/2019:20:36:48 +0300] "POST / HTTP/1.1" 405 173 "-" "curl/7.52.1"

Если удалить location:

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

        server {

        listen 127.0.0.1:80 default_server;
        server_name localhost;
        }

access_log /var/log/nginx/access.log postdata;
---------------------------------
в лог придет:
escape=json "POST / HTTP/1.1" 405 [REQEUST BODY]: [-] -

вроде то что надо, но тела запроса нет.

может nginx не обрабатывает тело запроса если запрос вызвал ошибку...

модуль echo установлен:
nginx -V | grep echo
--add-dynamic-module=/build/nginx-0TiIP5/nginx-1.10.3/debian/modules/nginx-echo


error_page  405     =200 $uri;    ничего не дает, рузультат тот-же
--------

-------------------------------
error_page 405 = @app;

  location @app {
    proxy_pass http://localhost:8080;
  }
--------------------------------
так-же дает ошибку 405, на 'nc -lp 8080 ' ничего не пришло,

в логе:
escape=json "POST / HTTP/1.1" 405 [REQEUST BODY]: [-] -

я понимаю только то что я ничего не понимаю в nginx, ведь не могут конфиги просто не работать...

Подскажите как логировать POST, только nginx-ом?

тут https://nginx.org/ru/docs/ ответа не нашел, может не понял чего...


  • nginx не логирует тело POST запроса, !*! туманвёжике, 23:05 , 04-Апр-19 (1)
    Попробуйте так:

    log_format postdata $request_body;

    server {
        # ...
        # ...
        location = / {
           access_log  /var/log/nginx/postdata.log  postdata;
           fastcgi_pass php_cgi;
        }
    }


    Или так:

    https://gist.github.com/dzlab/2e6e79419877dc29d2efc63ae5974f...

    • nginx не логирует тело POST запроса, !*! novichok, 18:18 , 06-Апр-19 (2)
      Попробовал,

      первый вариант выдает:

      nginx: [emerg] no port in upstream "php_cgi" in /etc/nginx/nginx.conf:46
      nginx: configuration file /etc/nginx/nginx.conf test failed

      гуглю за установку\настройку php_cgi.


      второй вариант - результат тот-же, 405 и вот это в лог:

      ::1 - - [06/Apr/2019:18:13:43 +0300] "POST / HTTP/1.1" 405 173 "-" "curl/7.52.1"


      • nginx не логирует тело POST запроса, !*! novichok, 01:57 , 07-Апр-19 (3)
        в nginx не смог :(

        установил lighttpd иииии..... тоже не смог!

        нашел документацию по lighttpd на русском:

        https://www.opennet.ru/docs/RUS/lighttpd_doc/
        https://www.opennet.ru/docs/RUS/lighttpd_doc/accesslog.html

        но или не работает так как написано или я опять ничего не понимаю,

        приведен пример:
        accesslog.format = "%h %l %u %t \"%r\" %b %>s \"%{User-Agent}i\" \"%{Referer}i\""

        среди возможных вариантов есть "%q строка запроса(query)"

        пишем в конфиг
        accesslog.format = "%q"
        и в лог не приходит ничего.

        мне надо ловить приходящие от пользователя 2000 символов иметодом тыка я смог передать их в поле "User-Agent" используя его вместо тела POST запроса... но это неправильно блин.

        так-же lighttpd в отличие от nginx пишет лог не сразу после обработки запроса если писать в файл а не передавать скрипту\программе.

        вообщем получился такой костыль:

        --------------------------------------lighttpd.conf:
        server.modules = (
                "mod_access",
                "mod_accesslog",
                "mod_alias",
                "mod_compress",
                "mod_redirect",
        )

        server.document-root        = "/var/www/html"
        server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
        server.pid-file             = "/var/run/lighttpd.pid"
        server.username             = "www-data"
        server.groupname            = "www-data"
        server.port                 = "80"
        server.bind                 = "127.0.0.1"

        accesslog.format           = "[method: %m] [head]: %{User-Agent}i [body]: \"%q\$
        #accesslog.filename         = "/var/log/lighttpd/access.log"
        accesslog.filename         = "|/var/log/lighttpd/test.sh"

        server.errorlog            = "/var/log/lighttpd/error.log"

        server.tag                 = "lighttpd"
        server.network-backend = "linux-sendfile"


        index-file.names            = ( "index.php", "index.html", "index.lighttpd.html$
        url.access-deny             = ( "~", ".inc" )
        static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

        compress.cache-dir          = "/var/cache/lighttpd/compress/"
        compress.filetype           = ( "application/javascript", "text/css", "text/htm$

        # default listening port for IPv6 falls back to the IPv4 port
        include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
        include_shell "/usr/share/lighttpd/create-mime.assign.pl"
        include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
        ----------------------------------------------------------------

        ------------/var/log/lighttpd/test.sh:

        #!/bin/sh

        char="1"
        end="2"

        while [ $char != $end ];
        do
        read ok
        echo $ok >>/var/log/lighttpd/log
        done
        ------------------------------------------

        Понимаю что для профи это все как анекдот :) , сам ржу хотя охота что-то разбить, пять вечеров угробил на это ггг...

        Обьясните как правильно писать тело пост запроса в лог средствами самого вебсервера(без обращений к сторонним программам)?
        Ведь он пишет в лог заголовок, пишет юзер-агента... почему post не пишет?





Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру