Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
Nginx Error 499: Client Closed Request (client terminated connection before upstream replied) Linux / DevOps

Nginx Error 499: Client Closed Request — Причины и решение

Обновлено: 18.08.2026  ·  Официальная база знаний

В логе доступа Nginx (access.log) фиксируются запросы с нестандартным HTTP-статусом 499 и нулевым размером ответа (body_bytes_sent: 0). В error.log может появляться запись: client closed connection while waiting for request / upstream response.

СущностьДействиеПричина
HTTP-клиент (Браузер / Мобильное приложение)Отправляет TCP FIN / RST (разрыв сессии)Сработал локальный таймаут (например, в axios/fetch = 5000ms) или пользователь нажал «Отмена»
Upstream (Бэкенд / База данных)Продолжает выполнять тяжелый запросОбработка занимает слишком много времени
NginxФиксирует разрыв и записывает статус 499Nginx не успел передать ответ, так как сокет уже закрыт клиентом
  • Код 499 не отдается пользователю в браузер (пользователь видит сетевую ошибку или aborted request).
  • На бэкенде накапливаются очереди зависших вычислений или неоптимизированных SQL-запросов.
  1. Локализуйте медленные эндпоинты в access.log, отфильтровав их по статусу 499:
    awk '($9 ~ /499/)' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -n 10
  2. Увеличьте таймауты на стороне вызывающего клиента (Frontend / Mobile App / Microservice HTTP client), если операция действительно требует времени.
  3. Оптимизируйте скорость работы бэкенда (индексы в БД, кеширование в Redis), чтобы ответ отдавался быстрее, чем клиент сбросит сессию.
  4. Если бэкенд обязан гарантированно завершить операцию (например, финансовую транзакцию или оформление заказа), даже если клиент закрыл вкладку, включите в Nginx директиву proxy_ignore_client_abort:
    location /api/payment/ {
        proxy_pass http://payment_backend;
        # Не разрывать соединение с бэкендом при отключении клиента:
        proxy_ignore_client_abort on;
    }
  5. Проверьте конфигурацию и примените: sudo nginx -s reload.
Что такое код 499: Статус 499 Client Closed Request — это проприетарный код, введенный создателем Nginx Игорем Сысоевым для явного различения в логах ошибок самого бэкенда (504 Gateway Timeout) от случаев, когда клиент самостоятельно оборвал ожидание.
Практический опыт инженера: Массовые всплески 499 ошибок в сочетании с падением RPS — индикатор того, что пул процессов бэкенда (PHP-FPM, uWSGI) забился и перестал принимать новые соединения из очереди backlog.

Частые вопросы (FAQ)

Почему в браузере не виден статус 499?

Потому что именно браузер инициировал закрытие TCP-соединения. Nginx не может отправить HTTP-ответ в уже закрытый сокет и лишь фиксирует этот факт в своем access.log.

Что делает директива proxy_ignore_client_abort on?

По умолчанию при разрыве связи с клиентом Nginx немедленно обрывает запрос к бэкенду. Директива proxy_ignore_client_abort on заставляет Nginx дождаться финального ответа бэкенда.

Может ли агрессивный Cloudflare таймаут вызывать 499 в Nginx?

Да. Таймаут Cloudflare составляет 100 секунд. Если бэкенд отвечает дольше, Cloudflare разрывает соединение с Nginx, и Nginx логирует этот запрос со статусом 499.

Как отличить 499 из-за пользователя от 499 из-за бага фронтенда?

Если 499 происходит ровно через 5000ms или 10000ms после старта запроса — это жесткий таймаут в конфигурации HTTP-клиента фронтенда (например, timeout в axios).