Назад | Перейти на главную страницу

nginx. Как записывать ошибки ssl, не взрывая логи сервера

У меня есть веб-сайт, который посещают разные мобильные устройства и встроенные устройства.

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

Причины могут быть:

Поскольку устройства находятся в удаленных местах, у них нет легкодоступных журналов, я хотел бы иметь возможность анализировать такие проблемы с помощью журналов nginx.

Я могу сделать это, увеличив уровень журнала ошибок для отладки.

error_log  /var/log/nginx/errors_with_debug.log debug;

Однако эти журналы содержат множество вещей, которые меня не интересуют.

Есть ли способ записывать подробную информацию только в том случае, если в ssl-соединении было отказано, но есть нормальный уровень журнала ошибок для всех других случаев?

Пока я включаю debug ведение журнала, попросите удаленных пользователей, у которых есть проблемы с их устройствами, подключиться и записать трассировки, отключите уровень отладки, перезагрузите nginx и проанализируйте полученные трассировки.

Фактически, мне бы уже помогли, если бы я мог просто зарегистрировать дату и IP-адрес любого клиента, который не смог подключиться из-за проблем с SSL.

В идеале я также хотел бы записать причину, но было бы очень полезно знать, что соединение было предпринято, но не удалось из-за SSL.

А:

  1. включить «отладку»
  2. создать канал вместо файла журнала (убедитесь, что логротация не повредит)
  3. создать слушателя в фоновом режиме (cat awk, grep, sed, что угодно и т. д.)
  4. перезапустить nginx

B:

error_log syslog: server = unix: /var/log/nginx.sock отладка;

Все упомянутые вами ошибки установления связи SSL регистрируются nginx в info уровень, поэтому вам не нужно включать отладку.

Вы не упоминаете, какой дистрибутив вы используете, но большинство систем в настоящее время поставляются с SystemD поэтому перенаправляем ваши журналы на стандартную ошибку:

error_log stderr info;

или системный журнал:

error_log syslog:server=/dev/log info;

позволит systemd-journald для сбора всех журналов Nginx и управления их размером. Простой:

journalctl -u nginx.service -a -p info

позволит вам перечислить все сообщения отладки выше info уровень (при условии, что вы используете системный журнал).

Если вам нужно больше данных для определенных клиентов, вы можете использовать Nginxс debug_connection:

events {
    debug_connection 192.0.50.1;
    ...
}

Как вы упомянули в своем вопросе, установка уровня журнала debug для всех клиентов обязательно произведет много продукции. Если вам нужно включить отладку, вы можете сделать это на уровне подсистемы. Хотя это не задокументировано в документации журнал ошибок, эта директива принимает также более тонкое подразделение debug уровень (ср. исходный код): debug_core, debug_alloc, debug_mutex, debug_event, debug_http, debug_mail, debug_stream. Вас интересует debug_event уровень, но вы можете добавить несколько в error_log директива, например:

error_log syslog:server=/dev/log debug_http debug_event;