Как настроить логирование и ротацию логов Nginx на Ubuntu

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

В этой статье мы рассмотрим возможности логирования Nginx на Ubuntu, а также разберем настройку логирования и ротации логов в Nginx. В качестве примера будет использоваться VPS на базе Ubuntu 22.04, но в любом современном дистрибутиве всё должно работать аналогичным образом.

Директива Nginx error_log

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

Синтаксис error_log

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

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

error_log log_file log_level

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

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

Директива error_log может записывать в лог больше или меньше информации, в зависимости от указанного уровня логирования Nginx, который может быть одним из следующих:

  • emerg – аварийные ситуации, когда Nginx находится в нерабочем состоянии;
  • alert – серьезные ситуации, на которые необходимо срочно отреагировать;
  • crit – критические проблемы, требующие решения;
  • error – различные ошибки, возникающие во время работы;
  • warn – предупреждения, которые означают, что что-то произошло;
  • notice – оповещения, на которые стоит обратить внимание;
  • info – различные информационные сообщения, возникающие в процессе работы;
  • debug – отладочные сообщения, которые могут быть полезны при решении проблем.

Чем выше расположен уровень в списке, тем выше его приоритет. Если вы укажете какой-либо уровень, то в лог будут записаны сообщения этого уровня, а также все сообщения с более высоким приоритетом. Например, если вы укажете уровень error, то в логе будут записи уровня error, crit, alert, emerg.

Пример использования директивы error_log можно найти в основном конфигурационном файле Nginx. Откройте его любым удобным вам текстовым редактором, например, nano:

sudo nano /etc/nginx/nginx.conf

Пролистайте файл до секции # Logging Settings:

. . .
##
# Logging Settings
##

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 входит в основной модуль Nginx, а следующие директивы, которые стоит рассмотреть, входят в модуль HttpLogModule. Этот модуль предоставляет возможность настраивать логи и включает сразу несколько полезных директив. Остановимся на этих директивах немного подробнее.

Директива log_format

Директива log_format используется для описания формата записей логов с помощью текста и различных переменных.

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

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

Определение этой директивы поддерживает несколько строк и завершается символом “;”.

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

Общий синтаксис директивы log_format:

log_format format_name string_describing_formatting;

Вы можете использовать переменные, которые поддерживаются Nginx, для формирования формата записей.

Директива access_log

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

Синтаксис директивы access_log:

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

По умолчанию access_log также использует формат combined. Вы можете использовать любой формат, который можете определить с помощью директивы log_format.

buffer_size определяет максимальный размер данных, который будет хранить Nginx перед записью в лог. Вы также можете настроить сжатие файла логов, добавив параметр gzip в определение директивы:

access_log /path/to/log/location format_of_log gzip;

В отличие от директивы error_log, если вы хотите отключить логирование, вы можете указать параметр off в конфигурационном файле:

. . .
##
# Logging Settings
##

access_log off;
error_log /var/log/nginx/error.log;
. . .

В этом случае нет необходимости записывать лог в /dev/null.

Настройка ротации логов Nginx

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

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

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

Обратите внимание!
Обычно самый “свежий” файл логов использует суффикс .0 в названии, а более старые файлы – суффиксы .1, .2 и так далее.

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

Для перемещения файла логов используйте команду:

mv /path/to/access.log /path/to/access.log.0

В файле /var/run/nginx.pid Nginx хранит PID мастер-процесса. Файл, в котором хранится PID, указывается в основном конфигурационном файле Nginx /etc/nginx/nginx.conf с помощью директивы pid:

...
user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
...

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

kill -USR1 `cat /var/run/nginx.pid`

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

Ротация логов с помощью logrotate

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

Чтобы просмотреть его, откройте скрипт любым удобным вам текстовым редактором, например, nano:

sudo nano /etc/logrotate.d/nginx
Обратите внимание!
В первой строке скрипта указывается директория, в которой будут работать указанные ниже инструкции. Помните об этом, если решите сменить директорию, в которой Nginx хранит лог-файлы.

В остальной части скрипта указано, что ротация будет ежедневной и будут храниться 52 копии старых лог-файлов.

Заметьте, что в секции postrotate используются команды, о которых мы говорили выше:

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

Заключение

Эта статья охватывает только основы логирования Nginx на Ubuntu.

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

Заказать VPS и выбрать подходящую вам конфигурацию сервера можно у нас – по этой ссылке.

Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “Помощь и поддержка”), а если вы захотите обсудить эту статью или настройки логирования Nginx с коллегами по цеху и сотрудниками Бегета – ждем вас в нашем сообществе в Telegram.

2
839