Справочник

Журналы nginx: access.log и error.log — где они и как их читать

nginx ведёт два журнала: access.log — каждый запрос к сайту, error.log — ошибки. В Ubuntu оба лежат в папке /var/log/nginx/, команды для их чтения набирайте с sudo. Последние ошибки покажет команда sudo tail -n 20 /var/log/nginx/error.log.

≈ 13 мин чтения
Содержание 13

Что сделать прямо сейчас

  1. Команды вводятся на сервере: подключитесь к нему по SSH ([как подключиться](/instrukcii/kak-podklyuchitsya-k-vps-po-ssh/)) и набирайте их в том же окне.
  2. Посмотрите последние ошибки: sudo tail -n 20 /var/log/nginx/error.log. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter.
  3. Посмотрите последние запросы к сайту: sudo tail -n 20 /var/log/nginx/access.log.
  4. Чтобы видеть новые строки сразу, наберите sudo tail -f /var/log/nginx/error.log и откройте сайт в браузере. Выйти — Ctrl+C.
  5. Если запросов к вашему сайту в журнале нет, у сайта может быть свой журнал — как его найти.
  6. Что значит строка из журнала ошибок — таблица сообщений.

Где лежат журналы

ФайлЧто в нём
/var/log/nginx/access.logжурнал запросов: каждый запрос к сайту — IP посетителя, страница, код ответа
/var/log/nginx/error.logжурнал ошибок: нет файла, нет прав, приложение не отвечает, nginx не смог запуститься
access.log.1, error.log.1предыдущие журналы: Ubuntu переименовывает журналы раз в сутки
access.log.2.gz и дальшеболее старые журналы, сжатые — как их читать

Эти пути заданы в файле /etc/nginx/nginx.conf: строка error_log — в начале файла, access_log — в блоке http. Если у сайта свой журнал, строки access_log и error_log стоят в файле настроек сайта. Все строки с журналами покажет команда:

sudo nginx -T 2>/dev/null | grep '_log '

nginx -T выводит все настройки вместе с подключёнными файлами, а grep оставляет из них строки с журналами. Строки, которые начинаются со знака #, выключены. Если команда ничего не вывела, проверьте настройки: sudo nginx -t — при ошибке в них nginx -T ничего не покажет.

Как читать журнал запросов

В Ubuntu у строки access_log не указан формат — значит, nginx пишет журнал в формате combined. Строка журнала состоит из таких частей, по порядку:

ЧастьЧто значит
$remote_addrIP посетителя
-просто дефис: это место в формате ничем не заполняется
$remote_userимя пользователя, если страница закрыта паролем
[$time_local]дата и время по часовому поясу сервера
"$request"строка запроса: метод, адрес страницы и версия протокола, например GET /about/ HTTP/1.1
$statusкод ответа: 200 — страница отдана, 404 — страницы нет, 500 и выше — ошибка на сервере
$body_bytes_sentсколько байт отправлено посетителю, без заголовков ответа
"$http_referer"с какой страницы пришёл посетитель (заголовок Referer)
"$http_user_agent"браузер или программа посетителя (заголовок User-Agent)

Если значения нет — например, посетитель открыл сайт не по ссылке, — на его месте стоит дефис. Номера частей для подсчётов командой awk — в разделе Готовые команды для журнала nginx.

Как найти нужные строки

Последние 20 ответов с кодом 404:

sudo grep '" 404 ' /var/log/nginx/access.log | tail -n 20

Кавычка и пробелы в шаблоне нужны, чтобы grep нашёл именно код ответа, а не число 404 в адресе страницы. Ответы с ошибками сервера — коды от 500 до 599:

sudo grep '" 5[0-9][0-9] ' /var/log/nginx/access.log | tail -n 20

Все запросы с одного IP: sudo grep '^203.0.113.10 ' /var/log/nginx/access.log. Вместо 203.0.113.10 подставьте нужный адрес.

Сколько раз встречается каждый код ответа и какие страницы открывают больше всего — Команды wc, sort и uniq. Все ключи grep — Команда grep.

Как читать журнал ошибок

Строка журнала ошибок состоит из частей, перечисленных ниже. Не в каждой строке есть все: сведения о запросе бывают только у ошибок, которые случились во время его обработки.

ЧастьЧто значит
2026/10/14 12:00:00дата и время: год, месяц, день, часы, минуты, секунды
[error]уровень — насколько это серьёзно, подробнее
1234#1234:номер процесса nginx и через знак # — номер потока
*15номер соединения: по нему можно найти все строки об этом соединении
текст сообщениячто случилось
(2: No such file or directory)код и описание системной ошибки — причина
while …что nginx делал в этот момент, например while connecting to upstream — подключался к приложению
client:IP посетителя
server:первое имя из строки server_name сайта
request:строка запроса, как в журнале запросов
upstream:адрес приложения или PHP-FPM, куда nginx передавал запрос
host:имя сайта, которое запросил посетитель (заголовок Host)
referrer:с какой страницы пришёл посетитель

Что значат сообщения в журнале ошибок

СообщениеЧто значит и что делать
open() "…" failed (2: No such file or directory)запрошенного файла нет, посетитель получил 404 — разбор
open() "…" failed (13: Permission denied)у nginx нет прав на файл, посетитель получил 403 — 403 Forbidden
directory index of "…" is forbiddenв папке нет индексного файла, посетитель получил 403 — 403 Forbidden
connect() failed (111: Connection refused)приложение не принимает подключения — 502 Bad Gateway
connect() to unix:… failedPHP-FPM не запущен, не хватает прав на его сокет, в настройках не тот сокет или PHP-FPM не успевает принимать запросы — 502 Bad Gateway
upstream timed out (110: Connection timed out)приложение не ответило вовремя — 504 Gateway Timeout
client intended to send too large bodyпосетитель отправил файл больше лимита — 413 Request Entity Too Large
Primary script unknownPHP-FPM не нашёл файл .php — разбор
worker_connections are not enoughу nginx кончились соединения — как увеличить

Если вашего сообщения нет в таблице, найдите его в списке Все ошибки nginx.

Уровни журнала ошибок

Каждая строка журнала ошибок отмечена уровнем. Уровни от самого подробного к самому серьёзному:

УровеньЧто пишется
debugподробности для отладки. nginx в Ubuntu собран с поддержкой этого уровня, но журнал растёт очень быстро — включайте ненадолго
infoсведения о работе, например что посетитель закрыл соединение
noticeзаметки, например о запуске рабочих процессов
warnпредупреждения, например что соединений не хватает и nginx закрывает простаивающие
errorошибки при обработке запросов: нет файла, нет прав
critсерьёзные сбои, например nginx не может принять соединение из-за лимита открытых файлов
alertсбои, которые требуют срочно вмешаться, например кончились соединения
emergnginx не может запуститься или применить настройки: ошибка в файле настроек, занят порт

Уровень пишут в строке error_log после имени файла. nginx записывает сообщения этого уровня и более серьёзные. В Ubuntu уровень не указан — значит, error: в журнал попадают error, crit, alert и emerg, а предупреждения warn и заметки notice — нет. Чтобы видеть и предупреждения, в файле /etc/nginx/nginx.conf допишите уровень:

error_log /var/log/nginx/error.log warn;

Затем проверьте настройки и примените их: sudo nginx -t, потом sudo systemctl reload nginx.

Журналы отдельного сайта

Чтобы запросы и ошибки одного сайта шли в свои файлы, задайте их в блоке server:

  1. Откройте файл сайта: sudo nano /etc/nginx/sites-available/example.com. Вместо example.com — имя файла вашего сайта: список покажет ls /etc/nginx/sites-enabled/. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter.
  2. В блоке server, после строки server_name, добавьте две строки — как в примере ниже.
  3. Сохраните файл — Ctrl+O, Enter, затем Ctrl+X — и проверьте настройки: sudo nginx -t. В ответе должны быть слова syntax is ok и test is successful. Тогда примените их: sudo systemctl reload nginx. Если команда ничего не ответила, настройки применены.
  4. Откройте сайт в браузере и проверьте, что запрос появился в новом журнале: sudo tail -n 5 /var/log/nginx/example.com.access.log.
server {
    server_name example.com;
    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    # остальные строки блока — без изменений
}

Строки в блоке server заменяют общие из nginx.conf: запросы к этому сайту и ошибки при их обработке будут записываться в его файлы. Файлы nginx создаст сам, а папку — нет, поэтому пишите путь в папку, которая уже есть, — /var/log/nginx/. Имя файла заканчивайте на .log: тогда Ubuntu будет чистить и этот журнал — как.

Как отключить журнал

Строка access_log off; отключает журнал запросов в блоке, где она стоит. Например, чтобы не записывать запросы к значку сайта, добавьте в блок server:

location = /favicon.ico {
    access_log off;
    log_not_found off;
}

log_not_found off отключает записи в журнал ошибок о том, что файла нет: если значка на сайте нет, журнал не будет заполняться строками о нём.

Журнал ошибок так не отключается: в строке error_log off; nginx примет off за имя файла и будет писать ошибки в файл с именем off. Чтобы записей стало меньше, поднимите уровень: error_log /var/log/nginx/error.log crit;. Отключать журнал ошибок совсем не стоит — по нему находят причину 502, 403 и других ошибок.

Как Ubuntu чистит старые журналы

Журналы nginx в Ubuntu обслуживает программа logrotate, её настройки для nginx — в файле /etc/logrotate.d/nginx. Раз в сутки она переименовывает журнал в .1, а вчерашний файл .1 сжимает в .2.gz. Хранятся 14 старых файлов, более старые удаляются. Пустой журнал не переименовывается. После переименования nginx начинает писать в новый файл.

Сжатый журнал читают командой zcat, искать в нём — командой zgrep:

sudo zcat /var/log/nginx/access.log.2.gz | tail -n 20
sudo zgrep '" 404 ' /var/log/nginx/access.log.2.gz

В настройках logrotate стоит шаблон /var/log/nginx/*.log — все файлы с окончанием .log в этой папке. Поэтому свои журналы сайтов кладите туда же и называйте с .log на конце. Если журналы всё же заняли диск — No space left on device.

Ошибки и как их исправить

Что видитеЧто делать
open() "/var/log/nginx/…" failed (2: No such file or directory)в пути к журналу папка, которой нет, — как исправить
unknown log format "main"в строке access_log указан формат main, а в Ubuntu его нет: уберите слово main из строки или опишите формат строкой log_format в блоке http
"log_format" directive is not allowed herelog_format пишется только в блоке http, не в server — разбор ошибки
Permission denied при чтении журналажурналы может читать не каждый пользователь: добавьте sudo в начало команды
журнал пустойего недавно переименовали, и новых записей ещё нет: смотрите access.log.1 или error.log.1
запросов к сайту нет в access.logу сайта свой журнал — как его найти
nginx -t без sudo пишет Permission deniedзапускайте проверку с sudo — разбор

Источники

Сверено 14 октября 2026 года.

Что почитать дальше