При работе с различными приложениями часто приходится обращаться к журналам, в которых записываются и хранятся различные данные, от информации об отладке до сведений о проблемах. С помощью Nginx пользователи также могут работать с журналами событий, которые помогают решать различные проблемы.
Nginx использует два типа журналов:
- Журнал доступа регистрирует все запросы, которые поступают и обрабатываются через Nginx.
- Журнал ошибок регистрирует различные ошибки, в том числе ошибки конфигурации как Nginx, так и сторонних сервисов (например,
php-fpm
).
Сегодня мы рассмотрим структуру журналов доступа и ошибок в Nginx.
Предварительные условия
Для работы с журналами Nginx нам понадобится следующее:
- Один сервер или виртуальная машина с любым предустановленным дистрибутивом Linux: Ubuntu, Debian, RHEL, CentOS и многими другими. В этой статье будет использоваться Ubuntu 22.04.
- Установленный веб-сервер Nginx. Вы можете установить Nginx в Ubuntu, следуя этому руководству. В этой статье мы будем использовать Nginx 1.18.0, установленный из репозиториев дистрибутива Ubuntu.
Журнал доступа
Как упоминалось ранее, access_log
используется для записи всех запросов от клиентов. Каждый раз, когда поступает запрос от клиента, Nginx записывает его в журнал доступа. Сохранённая запись содержит метку времени и информацию о клиенте, включая адрес запрашиваемого ресурса, адрес клиента и многое другое. По умолчанию журнал доступа записывается в файл access.log
, расположенный по адресу /var/log/nginx
.
Типичная запись в журнале доступа имеет следующий формат:
166.1.227.189 - - [20/Nov/2024:13:52:04 +0300] "GET /favicon.ico HTTP/1.1" 404 197 "http://91.206.179.176/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
Где:
166.1.227.189
: IP-адрес клиента, отправившего запрос.-
: Идентификатор клиента. Если возвращается тире, это означает, что аутентификация identd не используется.-
: Имя пользователя. Если возвращается тире, это означает, что аутентификация на запрашиваемом ресурсе либо не требуется, либо не прошла успешно.[20/Nov/2024:13:52:04 +0300]
: отметка времени, когда был отправлен запрос: дата, время и часовой пояс.GET /favicon.ico HTTP/1.1
: Строка HTTP-запроса. Она состоит из:GET
: Метод, используемый для доступа к запрошенному ресурсу./favicon.ico
: Запрошенный ресурс.HTTP/1.1
: Используемая версия протокола HTTP.
404
: Код ответа HTTP. В данном случае код 404 означает, что запрошенный ресурс не найден.197
: Размер передаваемого ответа в байтах (включая заголовки и тело).http://91.206.179.176/
: HTTP-реферер (содержит URL-адрес источника запроса).Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
: Пользовательский агент клиента (содержит информацию о браузере и операционной системе).
Вы можете настроить журнал доступа на уровне веб-сервера, задав необходимые параметры в файле nginx.conf
или отдельно для каждого веб-сайта, используя его файл конфигурации в каталоге /etc/nginx/sites-available
(если Nginx был установлен из репозиториев операционной системы) или в каталоге /etc/nginx/conf.d
.
Для настройки журнала доступа используются два параметра:
log_format
: Указывает формат журнала и данные, которые будут в него записываться. Используется множество встроенных переменных (которые будут рассмотрены позже).access_log
: Указывает расположение файла журнала доступа. По умолчанию используется путь/var/log/nginx/access.log
.
Вот пример настройки access.log
в основном файле конфигурации /etc/nginx/nginx.conf
:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent"'; access_log /var/log/nginx/access.log main; access_log /var/log/nginx/access.log main;
В этом примере мы используем следующие переменные:
$remote_addr
: Записывает IP-адрес клиента.$remote_user
: Записывает имя пользователя, переданное при аутентификации (если на сайте включена аутентификация).$time_local
: Записывает местное время, когда был сделан запрос.$request
: Записывает строку HTTP-запроса (включая метод, URI и версию протокола).$status
: Записывает состояние HTTP-ответа.$body_bytes_sent
: Записывает количество байт в теле ответа (исключая заголовки).$http_referer
: Записывает заголовок HTTP Referer (адрес страницы, с которой был выполнен запрос).$http_user_agent
: Записывает заголовок User-Agent (информацию о браузере/клиенте).
Более подробную информацию обо всех встроенных переменных можно найти в документации Nginx.
Вот полное содержимое файла nginx.conf
:
user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { ## # Основные настройки ## sendfile on; tcp_nopush on; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # Настройки SSL ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Настройки ведения журнала ## log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent"'; access_log /var/log/nginx/access.log; ## # Gzip Settings ## gzip on; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Настройки виртуального хоста ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
Журнал ошибок
Для записи различных типов ошибок в Nginx существует второй журнал: error_log
. В этом журнале записываются такие ошибки, как:
- Ошибки конфигурации
- Проблемы с подключением к внутренним серверам
- Ошибки, связанные с доступом к файлам / разрешениями
- Внутренние ошибки сервера (5xx)
- Проблемы, связанные с SSL
По умолчанию журнал ошибок записывается в файл error.log
по адресу /var/log/nginx
.
Типичная запись в журнале из error.log
файла выглядит следующим образом:
20/Nov/2024:14:00:00 [error] 1234#5678: *10 open() "/var/www/html/test-page.html" failed (2: No such file or directory), client: 127.0.0.1, server: my-local-server.com, request: "GET /test-page.html HTTP/1.1", host: "example.com"
Где:
20/Nov/2024:14:00:00
: Дата и время, когда произошла ошибка.[error]
: Уровень ошибки. Он может принимать значения[error]
,[info]
,[warn]
,[crit]
и другие. Мы рассмотрим уровни ведения журнала в следующей главе.1234#5678
: Идентификатор процесса и потока.open() "/var/www/html/test-page.html" failed (2: No such file or directory)
: Описание ошибки. В данном случае запрос был сделан для несуществующего файла (страницы) с именемtest-page.html
.client: 127.0.0.1
: IP-адрес клиента, отправившего запрос. В этом примере запрос был отправлен с локального компьютера (localhost).server: my-local-server.com
: Имя сервера, на который был отправлен запрос.request: "GET /test-page.html HTTP/1.1"
: Строка HTTP-запроса. Она состоит из:GET
: Метод, используемый для доступа к запрошенному ресурсу./test-page.html
: Запрошенный ресурс.HTTP/1.1
: Используемая версия протокола HTTP.
host: "example.com"
: Имя хоста, на который был отправлен запрос.
Вы можете настроить журнал ошибок так же, как и журнал доступа, задав необходимые параметры в файле nginx.conf
на уровне веб-сервера или отдельно для каждого веб-сайта.
Параметры журнала ошибок:
log_format
: Определяет формат журнала и данные, которые должны быть занесены в журнал.error_log
: Указывает путь к журналу ошибок.
Вот пример настройки error.log
, который следует включить в основной файл конфигурации веб-сервера nginx.conf
:
log_format error '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" "$gzip_ratio"'; error_log /var/log/nginx/access.log main;
Давайте рассмотрим переменные более подробно:
$remote_addr
: Записывает IP-адрес клиента.$remote_user
: Записывает имя пользователя, переданное при аутентификации (если на сайте включена аутентификация).$time_local
: Записывает местное время, то есть время, когда был отправлен запрос.$request
: Записывает строку HTTP-запроса (включая метод, URI и версию протокола).$status
: Записывает состояние HTTP-ответа.$body_bytes_sent
: Записывает количество байт в теле ответа (исключая заголовки).$http_referer
: Записывает заголовок HTTP Referer (адрес страницы, с которой был выполнен запрос).$http_user_agent
: Записывает заголовок User-Agent (информацию о браузере/клиенте).$gzip_ratio
: Записывает коэффициент сжатия Gzip (если сжатие Gzip включено в настройках Nginx).
Вот полное содержимое файла nginx.conf
:
user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { ## # Основные настройки ## sendfile on; tcp_nopush on; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # Настройки SSL ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Настройки ведения журнала ## log_format error '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" "$gzip_ratio"'; error_log /var/log/nginx/access.log error; ## # Настройки Gzip ## gzip on; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Настройки виртуального хоста ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
Уровни ведения журнала в журналах Nginx
В Nginx есть восемь уровней ведения журналов, которые применяются как к журналу доступа, так и к журналу ошибок:
debug
Предназначен для записи наиболее подробной информации, включая внутренние механизмы Nginx. Он регистрирует информацию о каждом запросе и модуле. Этот уровень используется для диагностики сложных проблем, особенно во время разработки или настройки.info
Используется для регистрации информационных сообщений о работе сервера. Эти сообщения могут включать, например, информацию о запуске или остановке серверных процессов.notice
Указывает на важные, но не критические события. Эти сообщения помогают понять, как работает система, но не требуют вмешательства администратора веб-сервера. Примером может служить обновление конфигурации.warn
Предупреждения в журналах, которые не являются критическими, но потенциально могут привести к проблемам в будущем.error
Сообщает о проблемах, которые привели к сбою конкретных запросов, но не повлияли на работу сервера в целом. Например, это может быть невозможность открыть файл или подключиться к серверной части.crit
Указывает на критические ошибки, которые могут нарушить нормальную работу сервера. Например, это может быть сбой модуля или нехватка ресурсов.alert
: Сообщает о серьезных проблемах, требующих немедленного внимания.emerg
: Самый высокий уровень ведения журнала. Указывает на критические ошибки, которые не позволяют серверу продолжать работу. Эти сообщения требуют немедленного исправления.
Заключение
Использование журналов доступа и ошибок Nginx может значительно упростить поиск и устранение неполадок. Журнал Nginx можно гибко настроить для записи только необходимых данных. Вы также можете настроить ведение журнала для каждого сайта отдельно или включить ведение журнала на уровне веб-сервера для всех сайтов.