Доступ к NGINX и журналы ошибок

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