Код 499 в nginx: клиент закрыл соединение — что значит и как исправить
499 — нестандартный код nginx: клиент закрыл соединение раньше, чем получил ответ. Сам посетитель этого кода не видит — он уже ушёл со страницы или его программа перестала ждать. Единичные 499 — норма. Много 499 на одних и тех же адресах — обычно признак того, что сайт отвечает слишком медленно.
Содержание 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 | Сервер не дождался запроса от клиента |
| 444 | nginx сам закрыл соединение, ничего не ответив |
| 499 | Клиент закрыл соединение, не дождавшись ответа |
| 504 | nginx не дождался ответа от PHP или приложения |
Источники
- Исходный код nginx: ngx_http_request.h — код 499 и комментарий к нему.
- Исходный код nginx: ngx_http_upstream.c — закрытие соединения с PHP или приложением.
- Документация nginx: proxy_ignore_client_abort и fastcgi_ignore_client_abort.
- Документация nginx: журнал доступа и переменная $upstream_response_time.
Сверено 6 октября 2026 года.
Что почитать дальше
- Ошибка 504 Gateway Timeout — когда не дождался уже nginx.
- Ошибка 502 Bad Gateway — когда PHP или приложение ответили не так, как надо.
- Как разместить сайт на VPS — настройка nginx с нуля.
- Что делать, если хостинг лежит — по шагам.
Проверено и обновлено: 07.10.2026