Записи журналов доступа Nginx не создаются для некоторых подключений, когда они происходят

У меня есть следующая архитектура сайта:

Интернет --> балансировщик нагрузки --> веб-сервер/api

Таким образом, на машине с балансировщиком нагрузки есть nginx, настроенный как балансировщик нагрузки, а также есть nginx на узле веб-сервера / API, работающий как обратный прокси. Сервер веб-сервера получает запросы от браузеров (через балансировщик нагрузки), обращается к API через HTTP и отображает страницу в браузере. Веб-сервер и API являются приложениями nodejs.

Балансировщик нагрузки nginx имеет записи в журнале для подключений веб-сервера -> API, но он не регистрирует начальные подключения браузера клиента -> веб-сервера до тех пор, пока браузер не будет закрыт (проверено с Chrome и Firefox). Как будто соединение сохраняется в незавершенном состоянии до тех пор, пока браузер не будет полностью закрыт, после чего записывается запись в журнал.

Журналы доступа к балансировщику нагрузки nginx:

110.110.110.101 - - [21/Feb/2019:22:21:23 +0000] loadbalancer01 TCP 200 186833 825 0.047 upstream: 10.0.0.100:443
110.110.110.100 - - [21/Feb/2019:22:21:37 +0000] loadbalancer01 TCP 200 24327 3856 21.991 upstream: 10.0.0.100:443 <-- only created after browser is closed
  • 110.110.110.100 - ip клиента, подключающегося к Chrome/Firefox
  • 110.110.110.101 — общедоступный интерфейс веб-сервера/узла API
  • 10.0.0.100 — частный интерфейс веб-сервера/узла API

Соединение веб-сервер-> API регистрируется первым, хотя оно явно происходит вторым, а соединение клиентского браузера-> веб-сервера регистрируется только тогда, когда клиентский браузер полностью закрыт.

Происходит ли какая-то буферизация? Я не использую параметр буфера в конфигурации ведения журнала потокового блока:

log_format combined '$remote_addr - - [$time_local] $hostname $protocol $status $bytes_sent $bytes_received $session_time upstream: $upstream_addr';

access_log /var/log/nginx/access.log combined;

Почему соединение регистрируется только тогда, когда браузер закрыт? Как я могу гарантировать, что начальное соединение регистрируется, когда соединение происходит?

[обновление - добавлена ​​конфигурация журнала, также обратите внимание, что ips были отредактированы]


person vy218    schedule 21.02.2019    source источник


Ответы (1)


Я понял это, сравнив заголовки между соединением браузера с балансировщиком нагрузки и соединением, инициированным из скрипта. Оказывается, браузеры устанавливают заголовок «Connection: keep-alive», который держит соединение открытым, так что несколько запросы могут быть отправлены с использованием того же соединения.

Полезные команды для запуска этого на общедоступном IP-адресе балансировщика нагрузки, чтобы увидеть заголовки соединения:

sudo tcpdump -nn -A -s1500 -l -i eth0 порт 80

Еще одна вещь, которую следует отметить, это то, что если вы используете ufw в качестве брандмауэра, он устанавливает базовые правила iptables с ограничениями, поэтому он регистрирует только первые 3 соединения в минуту.

person vy218    schedule 24.02.2019