Ошибки

Код 499 в nginx: клиент закрыл соединение — что значит и как исправить

499 — нестандартный код nginx: клиент закрыл соединение раньше, чем получил ответ. Сам посетитель этого кода не видит — он уже ушёл со страницы или его программа перестала ждать. Единичные 499 — норма. Много 499 на одних и тех же адресах — обычно признак того, что сайт отвечает слишком медленно.

Обновлено 07.10.2026≈ 4 мин чтения
Содержание 10

Что означает код 499

В стандарте HTTP кода 499 нет. В исходном коде nginx он называется NGX_HTTP_CLIENT_CLOSED_REQUEST, и комментарий к нему объясняет: в HTTP нет кода для случая, когда клиент закрыл соединение, пока сервер обрабатывал его запрос, поэтому nginx записывает в журнал свой код. Ставит он его, когда клиент ушёл раньше, чем nginx начал отправлять ответ. Клиенту при этом ничего не отправляется: соединения уже нет.

Если вы посетитель

Вы этот код не увидите: он есть только в журнале сервера. Если страница грузится так долго, что вы её закрываете, напишите владельцу сайта, какую страницу открывали и когда.

Откуда берутся 499

  • Посетитель закрыл вкладку или ушёл на другую страницу, не дождавшись загрузки.
  • У посетителя пропала связь — например, мобильный интернет.
  • Программа на стороне клиента ждёт меньше, чем отвечает сервер: система мониторинга, балансировщик, CDN, скрипт, который обращается к вашему API.
  • Скрипт на странице сам отменил запрос, который стал не нужен, — например, подсказки поиска по мере ввода.
  • Сайт отвечает слишком медленно, и люди или программы не дожидаются ответа.

Что происходит с запросом за nginx

Если nginx уже передал запрос дальше — PHP или приложению, — а клиент ушёл, по умолчанию nginx закрывает и соединение с ними, если не сохраняет этот ответ в свой кэш. В журнал ошибок на уровне info попадает строка:

client prematurely closed connection, so upstream connection is closed too

Как включить уровень info в журнале, рассказано в разборе ошибки 400.

Успеет ли PHP или приложение закончить начатую работу, зависит уже от самой программы. Чтобы nginx не обрывал соединение с ними, есть директивы proxy_ignore_client_abort и fastcgi_ignore_client_abort; по умолчанию они выключены.

Как найти медленные запросы

В стандартный журнал nginx время ответа не пишется. Заведите отдельный журнал. В блоке http (файл /etc/nginx/nginx.conf) опишите его формат:

log_format timing '$request_time $upstream_response_time $status "$request"';

А в блоке server сайта укажите два журнала — обычный и новый; в одном блоке их может быть несколько. Если строка access_log у сайта уже есть, оставьте её и добавьте вторую:

access_log /var/log/nginx/access.log;
access_log /var/log/nginx/timing.log timing;

После любых правок: sudo nginx -t, затем sudo systemctl reload nginx.

$request_time — сколько всего nginx обрабатывал запрос, $upstream_response_time — сколько времени ушло на получение ответа от PHP или приложения. Оба значения — в секундах с точностью до миллисекунд. Двадцать самых медленных запросов покажет команда:

sort -rn /var/log/nginx/timing.log | head -20

А двадцать адресов с наибольшим числом ответов 499 — команда по обычному журналу:

awk '$9 == 499 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

Она рассчитана на стандартный формат журнала nginx: девятое поле — код ответа, седьмое — адрес.

Когда 499 — норма, а когда пора разбираться

Единичные 499 — обычное дело: люди закрывают вкладки и теряют связь. Разбираться стоит, если доля 499 растёт или они собираются на одних и тех же адресах. Найдите эти адреса и посмотрите по журналу времени, сколько они обрабатываются.

Если PHP или приложение не ответят и за время, которое ждёт сам nginx, — по умолчанию 60 секунд, — посетитель получит уже не 499, а 504 Gateway Timeout.

Как исправить

Медленные страницы. Ускорьте то, что выполняется дольше всего: тяжёлые запросы к базе данных, обращения к сторонним сервисам, медленные плагины. Долгую работу — отчёты, рассылки, обработку файлов — выносите в фоновые задачи.

Клиент ждёт меньше, чем отвечает сайт. Если 499 оставляют система мониторинга, балансировщик или CDN, узнайте, сколько они ждут, и сравните со временем ответа сайта по журналу.

Чем 499 отличается от соседних кодов

КодКогда возникает
408Сервер не дождался запроса от клиента
444nginx сам закрыл соединение, ничего не ответив
499Клиент закрыл соединение, не дождавшись ответа
504nginx не дождался ответа от PHP или приложения

Источники

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

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

Проверено и обновлено: 07.10.2026