Журналирование и ротация логов Nginx на сервере Ubuntu
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 можно настроить для логирования определённого количества информации. Существуют следующие уровни логирования:
- emerg: критическая ситуация, аварийный сбой, система находится в нерабочем состоянии.
- alert: сложная предаварийная ситуация, необходимо срочно принять меры.
- crit: критические проблемы, которые необходимо решить.
- error: произошла ошибка.
- warn: предупреждение; в системе что-то произошло, но причин для беспокойства нет.
- notice: система в норме, но стоит обратить внимание на её состояние.
- info: важная информация, которую следует принять к сведению.
- Debug: информация для отладки, которая может помочь определить проблему.
Чем выше уровень находится в этом списке, тем выше его приоритет. Логи фиксируют указанный уровень логирования, а также все уровни с более высоким приоритетом. К примеру, если выбрать уровень 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 после выполнения ротации.
Заключение
Конечно, это руководство охватывает только основы логирования.
Правильная настройка логирования и разумное управление лог-файлами могут сэкономить немало времени и сил в случае возникновения проблем с сервером. Имея быстрый доступ к информации, которая поможет диагностировать проблемы и ошибки, можно исправить ситуацию в кратчайшие сроки.
Также очень важно следить за логами сервера, чтобы случайно не подвергнуть опасности конфиденциальную информацию.
Tags: NGINX, Ubuntu, Ubuntu 12.04