Журналы 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
- Что сделать прямо сейчас
- Где лежат журналы
- Как читать журнал запросов
- Как найти нужные строки
- Как читать журнал ошибок
- Что значат сообщения в журнале ошибок
- Уровни журнала ошибок
- Журналы отдельного сайта
- Как отключить журнал
- Как Ubuntu чистит старые журналы
- Ошибки и как их исправить
- Источники
- Что почитать дальше
Что сделать прямо сейчас
- Команды вводятся на сервере: подключитесь к нему по SSH ([как подключиться](/instrukcii/kak-podklyuchitsya-k-vps-po-ssh/)) и набирайте их в том же окне.
- Посмотрите последние ошибки:
sudo tail -n 20 /var/log/nginx/error.log. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter. - Посмотрите последние запросы к сайту:
sudo tail -n 20 /var/log/nginx/access.log. - Чтобы видеть новые строки сразу, наберите
sudo tail -f /var/log/nginx/error.logи откройте сайт в браузере. Выйти — Ctrl+C. - Если запросов к вашему сайту в журнале нет, у сайта может быть свой журнал — как его найти.
- Что значит строка из журнала ошибок — таблица сообщений.
Где лежат журналы
| Файл | Что в нём |
|---|---|
/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_addr | IP посетителя |
- | просто дефис: это место в формате ничем не заполняется |
$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:… failed | PHP-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 unknown | PHP-FPM не нашёл файл .php — разбор |
worker_connections are not enough | у nginx кончились соединения — как увеличить |
Если вашего сообщения нет в таблице, найдите его в списке Все ошибки nginx.
Уровни журнала ошибок
Каждая строка журнала ошибок отмечена уровнем. Уровни от самого подробного к самому серьёзному:
| Уровень | Что пишется |
|---|---|
debug | подробности для отладки. nginx в Ubuntu собран с поддержкой этого уровня, но журнал растёт очень быстро — включайте ненадолго |
info | сведения о работе, например что посетитель закрыл соединение |
notice | заметки, например о запуске рабочих процессов |
warn | предупреждения, например что соединений не хватает и nginx закрывает простаивающие |
error | ошибки при обработке запросов: нет файла, нет прав |
crit | серьёзные сбои, например nginx не может принять соединение из-за лимита открытых файлов |
alert | сбои, которые требуют срочно вмешаться, например кончились соединения |
emerg | nginx не может запуститься или применить настройки: ошибка в файле настроек, занят порт |
Уровень пишут в строке 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:
- Откройте файл сайта:
sudo nano /etc/nginx/sites-available/example.com. Вместо example.com — имя файла вашего сайта: список покажетls /etc/nginx/sites-enabled/. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter. - В блоке server, после строки server_name, добавьте две строки — как в примере ниже.
- Сохраните файл — Ctrl+O, Enter, затем Ctrl+X — и проверьте настройки:
sudo nginx -t. В ответе должны быть слова syntax is ok и test is successful. Тогда примените их:sudo systemctl reload nginx. Если команда ничего не ответила, настройки применены. - Откройте сайт в браузере и проверьте, что запрос появился в новом журнале:
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 here | log_format пишется только в блоке http, не в server — разбор ошибки |
Permission denied при чтении журнала | журналы может читать не каждый пользователь: добавьте sudo в начало команды |
| журнал пустой | его недавно переименовали, и новых записей ещё нет: смотрите access.log.1 или error.log.1 |
| запросов к сайту нет в access.log | у сайта свой журнал — как его найти |
nginx -t без sudo пишет Permission denied | запускайте проверку с sudo — разбор |
Источники
- Документация nginx: access_log — путь к журналу, формат combined по умолчанию, контексты, параметр off; дефис на месте значения, которого нет.
- Документация nginx: log_format — описание формата combined; директива пишется только в блоке http.
- Документация nginx: error_log — файл журнала, уровни от debug до emerg в порядке возрастания важности, контексты.
- Документация nginx: log_not_found — записывать ли в error_log, что файл не найден; по умолчанию on.
- Документация nginx: встроенные переменные — $remote_addr, $remote_user, $time_local, $request, $status, $body_bytes_sent и заголовки запроса $http_имя.
- Исходный код nginx 1.24.0: ngx_http_log_module.c — строка формата combined; свои access_log во внутреннем блоке заменяют строки внешнего.
- Исходный код nginx 1.24.0: ngx_log.c — дата, уровень, номер процесса и потока, номер соединения; stderr, memory: и syslog: — особые значения, остальное считается именем файла.
- Исходный код nginx 1.24.0: ngx_times.c — дата в журнале ошибок: год/месяц/день часы:минуты:секунды.
- Исходный код nginx 1.24.0: ngx_http_request.c — части while, client, server, request, upstream, host и referrer; сообщения client closed connection и client timed out — уровень info.
- Исходный код nginx 1.24.0: ngx_http_static_module.c — нет файла — 404, нет прав — 403, обе записи с уровнем error; при log_not_found off запись о ненайденном файле не делается.
- Файл nginx.conf из пакета nginx в Ubuntu 24.04 —
worker_processes auto,worker_connections 768,gzip on, журналы в /var/log/nginx/, подключение conf.d и sites-enabled. - Настройки logrotate для nginx в Ubuntu 24.04 — файлы /var/log/nginx/*.log, daily, rotate 14, compress и delaycompress, notifempty, create 0640 www-data adm.
- Правила сборки nginx в Ubuntu 24.04 — nginx собран с ключом --with-debug, уровень debug в нём работает.
- Исходный код nginx 1.24.0: nginx.c — ключ -t проверяет настройки, -T вдобавок печатает их целиком.
Сверено 14 октября 2026 года.
Что почитать дальше
- Настройки nginxкак устроены файлы и блоки, главные директивы.
- Как посмотреть файл: cat, less, head и tailкак листать и искать в длинном журнале.
- Команды wc, sort и uniqкак посчитать запросы, коды ответа и IP.
- Команда grepпоиск строк в файлах и журналах.
- 502 Bad Gatewayкак найти причину по журналу ошибок.
- worker_processes и worker_connectionsесли в журнале worker_connections are not enough.
- Все ошибки nginxсообщения nginx -t и журнала и что они значат.