Здравствуйте.
Прошу помочь и ткнуть носом в ошибку, четвертый вечер гуглю, доки на оф сайте читал, много всего перепробовал, но результат нулевой.Надо писать в лог тело 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/ ответа не нашел, может не понял чего...
Попробуйте так: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: [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 не смог :(установил lighttpd иииии..... тоже не смог!
нашел документацию по lighttpd на русском:
https://www.opennet.dev/docs/RUS/lighttpd_doc/
https://www.opennet.dev/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 не пишет?