Вовремя настроенное журналирование позволяет в дальнейшем избежать неожиданных проблем с веб-сервером. Информация, хранящаяся в логах (или журналах) сервера, помогает быстро оценить ситуацию и устранить ошибки.
В этой статье мы рассмотрим возможности логирования 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 и разумное управление лог-файлами могут сэкономить немало времени и сил в случае возникновения проблем с сервером – имея быстрый доступ к информации, которая поможет диагностировать проблемы и ошибки, можно исправить ситуацию в кратчайшие сроки.
Свежие комментарии