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

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

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
Nginx Error 502: Bad Gateway (upstream prematurely closed connection while reading response header) Linux / DevOps

Nginx 502: upstream prematurely closed connection — Решение сбоя

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

Nginx отправляет запрос в бэкенд, но целевое приложение аварийно закрывает TCP-сокет до того, как успевает вернуть валидный HTTP-заголовок ответа. В логах Nginx: peer closed connection in status 502 / upstream prematurely closed connection while reading response header.

Фактор отказаЧто происходит на бэкендеРезультат в Nginx
Segmentation Fault (Segfault)Процесс упал в core dump из-за ошибки памятиTCP FIN отправлен мгновенно
System OOM KillerЯдро Linux уничтожило бэкенд (SIGKILL)Мгновенный обрыв соединения
HTTP/Keep-Alive RaceБэкенд закрыл idle-соединение по таймаутуПовторный reuse сокета завершился сбросом
  • Ошибка проявляется хаотично или под определенными «тяжелыми» POST-запросами.
  • В логах бэкенда (PHP-FPM, Gunicorn, Puma) видны сообщения: child exited on signal 11 (SIGSEGV) или процесс внезапно перезапускается с новым PID.
  1. Проверьте системный журнал ядра на предмет падений процессов и работы OOM Killer:
    sudo dmesg -T | grep -E -i "segfault|oom|killed process"
    sudo journalctl -k --since "10 minutes ago"
  2. Изучите логи самого бэкенд-сервера (PHP-FPM, Uvicorn, Node):
    # Для PHP-FPM:
    sudo tail -n 50 /var/log/php*-fpm.log
    # Для Systemd юнита:
    sudo journalctl -u <backend> -n 50 --no-pager
  3. Если проблема вызвана race condition в keepalive соединениях между Nginx и бэкендом, настройте корректный блок upstream:
    upstream my_backend {
        server 127.0.0.1:8000;
        keepalive 32;
        keepalive_timeout 60s;
    }
    
    server {
        location / {
            proxy_pass http://my_backend;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }
    }
  4. Если процесс бэкенда падает по Segfault, отключите сбойные расширения (например, Xdebug, OPcache JIT или сторонние модули C/C++).
  5. Перезапустите стек сервисов: sudo systemctl restart <backend> nginx.
DevOps Траблшутинг: В 70% случаев эта ошибка указывает на моментальную гибель процесса приложения (Crash) при обработке конкретных входных данных. Включите coredump или детальное логирование бэкенда.
Практический опыт инженера: В микросервисах на Node.js/Go это частый симптом необработанного исключения (`uncaughtException` / `panic`), которое роняет весь процесс инстанса.

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

Почему Nginx пишет prematurely closed connection?

Потому что бэкенд разорвал TCP-сессию (отправил RST или FIN пакет) до отправки хотя бы одного байта HTTP-заголовка ответа.

Как проверить, не завершается ли процесс из-за OOM?

Выполните dmesg | grep -i 'killed process'. Если память процесса превысила лимит, ядро завершает его по SIGKILL, что вызывает данный сбой в Nginx.

Поможет ли увеличение proxy_read_timeout?

Нет, так как соединение не зависает по тайм-ауту, а активно и принудительно обрывается со стороны самого бэкенда.

Зачем указывать proxy_set_header Connection '' при keepalive?

По умолчанию Nginx выставляет заголовок 'Connection: close'. Очистка заголовка необходима для корректной работы постоянных Keep-Alive соединений по протоколу HTTP/1.1.