Site icon 8HOST.COM

Журналирование и ротация логов Nginx на сервере Ubuntu

Вовремя настроенное журналирование позволяет в дальнейшем избежать неожиданных проблем с веб-сервером. Информация, хранящаяся в логах (или журналах) сервера, помогает быстро оценить ситуацию и устранить ошибки.

Данное руководство знакомит с возможностями журналирования Nginx и предназначенными для этого инструментами.

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

Директива error_log

Для управления логами веб-сервер Nginx использует несколько специальных директив. Одна из основных директив – error_log.

Синтаксис error_log

Директива error_log используется для обработки общих сообщений об ошибках. В целом она очень похожа на директиву ErrorLog веб-сервера Apache.

Директива error_log имеет следующий синтаксис:

error_log log_file [ log_level ]

В примере log_file указывает файл, в который будут записываться данные, а log_level задаёт самый низкий уровень логирования.

Уровни логирования

Директиву error_log можно настроить для логирования определённого количества информации. Существуют следующие уровни логирования:

Чем выше уровень находится в этом списке, тем выше его приоритет. Логи фиксируют указанный уровень логирования, а также все уровни с более высоким приоритетом. К примеру, если выбрать уровень error, логи будут фиксировать уровни error, crit, alert и emerg.

Чтобы узнать, как используется данная директива, откройте главный конфигурационный файл.

sudo nano /etc/nginx/nginx.conf
. . .
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
. . .

Чтобы директива error_log не фиксировала никаких данных, отправьте её вывод в /dev/null.

error_log /dev/null crit;

Директивы HttpLogModule

Директива error_log ходит в основной модуль, а access_log (следующая директива, которую стоит рассмотреть) входит в модуль HttpLogModule, который предоставляет возможность настраивать логи.

В этот модуль также включено несколько других директив, помогающих настраивать пользовательские логи.

Директива log_format

Директива log_format описывает формат записи лога при помощи простого текста и переменных.

Формат, который использует Nginx, называется комбинированным. Этот общий формат используется многими серверами. Он имеет следующий вид:

log_format combined '$remote_addr - $remote_user [$time_local]  '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';

Определение этой директивы охватывает несколько строк и заканчивается точкой с запятой (;).

Фрагменты, которые начинаются с символа $, задают переменные; символы тире и квадратных скобок ([ и ]) воспринимаются буквально.

Общий синтаксис команды:

log_format format_name string_describing_formatting;

Директива access_log

Синтаксис директивы access_log похож на синтаксис error_log, но он более гибок. Та директива используется для настройки пользовательских логов.

Базовый синтаксис:

access_log /path/to/log/location [ format_of_log buffer_size ];

Стандартным форматом директивы access_log является combined (как и в log_format). Можно использовать любой формат, определённый в log_format.

Фрагмент команды buffer_size задаёт максимальный объём данных, которые хранит сервер Nginx, прежде чем внести их в лог. Чтобы настроить сжатие лог-файла, нужно добавить в директиву gzip:

access_log location format gzip;

В отличие от error_log, директиву access_log можно просто выключить:

access_log off;

Её вывод не обязательно переводить в /dev/null.

Ротация логов

Во избежание заполнения дискового пространства необходимо использовать механизмы логирования по мере роста лог-файлов. Ротация логов – это процесс, подразумевающий отключение устаревших или слишком объёмных лог-файлов и их архивирование (на установленный период времени).

Сервер Nginx не предоставляет инструментов для управления лог-файлами, но позволяет использовать механизмы, упрощающие ротацию логов.

Ротация логов вручную

Чтобы запустить ротацию логов вручную (или же создать скрипт для запуска ротации), выполните команды:

mv /path/to/access.log /path/to/access.log.0
kill -USR1 `cat /var/run/nginx.pid`
sleep 1
[ post-rotation processing of old log file ]

То есть сначала нужно переместить текущий лог в новый файл для хранения. В имени нового лог-файла принято использовать суффикс 0, в имени более старого – суффикс 1, и т.д.

Команда, выполняющая ротацию логов:

kill -USR1 /var/run/nginx.pid

На самом деле она не останавливает процесс Nginx, а отправляет ему сигнал, перезагружающий лог-файлы. Следовательно, новые запросы попадут в обновлённый лог-файл.

В файле /var/run/nginx.pid веб-сервер хранит pid главного процесса. Этот файл указывается в конфигурационном файле в строке, которая начинается с pid:

sudo nano /etc/nginx/nginx.conf
. . .
pid /path/to/pid/file;
. . .

После выполнения ротации нужно запустить команду:

sleep 1

Эта команда позволяет процессу завершить переход. После этого можно заархивировать старый лог-файл.

Утилита logrotate

logrotate – это простая программа для ротации логов. Её можно найти в репозитории Ubuntu. Кроме того, Nginx поставляется в Ubuntu с пользовательским скриптом logrotate.

Чтобы просмотреть скрипт, введите:

sudo nano /etc/logrotate.d/nginx

Первая строка в файле определяет точку системы, к которой будут применяться все последующие строки. Имейте это в виду, если решите изменить расположение логов в конфигурационных файлах Nginx.

Остальные строки файла будут выполнять ежедневную ротацию заданного файла, а также хранить 52 устаревшие его копии. К сожалению, данное руководство не охватывает общие настройки logrotate.

Как видите, раздел postrotate содержит команду, которая похожа на ту, что была использована при ручной ротации логов:

postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript

Этот раздел перезагружает лог-файлы Nginx после выполнения ротации.

Заключение

Конечно, это руководство охватывает только основы логирования.

Правильная настройка логирования и разумное управление лог-файлами могут сэкономить немало времени и сил в случае возникновения проблем с сервером. Имея быстрый доступ к информации, которая поможет диагностировать проблемы и ошибки, можно исправить ситуацию в кратчайшие сроки.

Также очень важно следить за логами сервера, чтобы случайно не подвергнуть опасности конфиденциальную информацию.