Ошибка 502 Bad Gateway: что значит и как исправить
502 Bad Gateway — сервер-посредник, например nginx, не смог получить от следующего сервера нормальный ответ: соединиться не удалось, ответ оборвался или был испорчен. Следующий сервер — это PHP-FPM, приложение на Python или Node.js или другой сервер. Сам nginx при этом работает: сломано то, что за ним. Причину nginx записывает в журнал ошибок.
Содержание 14
- Что означает код 502
- Если вы посетитель
- Как найти причину по журналу
- PHP-FPM не запущен или указан не тот сокет
- Нет прав на сокет
- Не хватает процессов PHP-FPM
- PHP или приложение оборвали ответ
- Заголовки ответа не помещаются в буфер
- Приложение не принимает подключения
- На обычном хостинге
- 502 и поиск Яндекса
- Чем 502 отличается от соседних кодов
- Источники
- Что почитать дальше
Что означает код 502
По стандарту HTTP код 502 значит: сервер, работая посредником, получил неправильный ответ от следующего сервера, к которому обратился, чтобы выполнить запрос. nginx отвечает 502 и тогда, когда соединиться со следующим сервером не удалось совсем.
Страница nginx с этой ошибкой называется «502 Bad Gateway», внизу у неё подпись nginx. Если страница выглядит иначе — например, оформлена в стиле CDN, — ответил другой посредник: тогда 502 значит, что уже CDN не получил нормального ответа от вашего сервера.
Если вы посетитель
- Обновите страницу через минуту: 502 бывает короткой — например, пока на сервере перезапускается PHP.
- Если ошибка держится, сообщите владельцу сайта, какую страницу вы открывали и когда.
Как найти причину по журналу
Причину nginx записывает в журнал ошибок. Последние строки покажет команда:
sudo tail -n 50 /var/log/nginx/error.logВсе строки из таблицы ниже nginx пишет на уровне error или выше, поэтому они видны в журнале без дополнительных настроек.
| Строка в журнале | Что случилось |
|---|---|
connect() to unix:/run/php/php8.3-fpm.sock failed (2: No such file or directory) | PHP-FPM не запущен или в настройках nginx указан сокет другой версии PHP |
connect() to unix:/run/php/php8.3-fpm.sock failed (13: Permission denied) | У nginx нет прав на сокет PHP-FPM |
connect() to unix:/run/php/php8.3-fpm.sock failed (11: Resource temporarily unavailable) | PHP-FPM перегружен: очередь подключений к сокету заполнена |
connect() failed (111: Connection refused) while connecting to upstream | По адресу и порту из proxy_pass никто не принимает подключения |
upstream prematurely closed FastCGI stdout или upstream prematurely closed connection | PHP или приложение закрыли соединение, не закончив ответ |
upstream sent too big header | Заголовки ответа не поместились в буфер nginx |
no live upstreams | Все серверы из группы upstream помечены как недоступные |
PHP-FPM не запущен или указан не тот сокет
Проверьте, работает ли PHP-FPM и какие сокеты есть на сервере:
systemctl status php8.3-fpm
ls -l /run/php/Если служба остановлена, запустите её командой sudo systemctl start php8.3-fpm и посмотрите в выводе systemctl status, нет ли ошибок при запуске. Если сокет в /run/php/ называется иначе, чем в строке fastcgi_pass, — например, после обновления PHP, — исправьте путь в настройках сайта. В Ubuntu 24.04 это php8.3-fpm.sock, в Ubuntu 26.04 — php8.5-fpm.sock.
Нет прав на сокет
nginx в Ubuntu работает от пользователя www-data, и ему нужно право читать сокет PHP-FPM и писать в него. Владельца, группу и права сокета задают настройки listen.owner, listen.group и listen.mode в настройках пула PHP-FPM (файл www.conf). Права по умолчанию — 0660: читать и писать могут только владелец и группа. Если вы меняли пользователя nginx или эти настройки, проверьте, что nginx попадает во владельцы или в группу сокета. После изменений перезапустите PHP-FPM.
Не хватает процессов PHP-FPM
PHP-FPM обрабатывает запросы ограниченным числом процессов. Их наибольшее число задаёт настройка pm.max_children, и в образце настроек, который идёт с PHP, она равна 5. Если все процессы заняты, новые запросы ждут в очереди, а когда заполнится и она, nginx получит ошибку (11: Resource temporarily unavailable) и ответит 502. О нехватке процессов PHP-FPM предупреждает в своём журнале строкой такого вида:
[pool www] server reached pm.max_children setting (5), consider raising itГде лежит журнал PHP-FPM, задаёт директива error_log в файле php-fpm.conf. Поднимайте pm.max_children с оглядкой на память: каждый процесс занимает свою. Если процессы заняты потому, что запросы выполняются долго, ищите медленные скрипты — как это сделать, рассказано в разборе ошибки 504.
PHP или приложение оборвали ответ
Строка «upstream prematurely closed» значит, что PHP или приложение закрыли соединение, не закончив ответ: процесс упал из-за ошибки или его остановила система — например, когда на сервере кончилась память. Посмотрите, что в это же время записано в журнале PHP-FPM или приложения.
Ещё одна причина — настройка request_terminate_timeout в пуле PHP-FPM: если она задана, процесс, который работает дольше, принудительно останавливается. По умолчанию она равна 0, то есть выключена.
Заголовки ответа не помещаются в буфер
Строка «upstream sent too big header» значит, что заголовки ответа — например, много cookie — не поместились в буфер nginx. По умолчанию он равен одной странице памяти: 4 или 8 КБ в зависимости от системы. Для PHP поднимите буферы в блоке location с fastcgi_pass:
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;Для приложений за proxy_pass то же делают директивы proxy_buffer_size и proxy_buffers. Меняйте обе директивы вместе: если поднять только fastcgi_buffer_size, проверка nginx -t может выдать ошибку про fastcgi_busy_buffers_size.
После любых правок: sudo nginx -t, затем sudo systemctl reload nginx.
Приложение не принимает подключения
Строка «Connection refused» значит, что по адресу и порту из proxy_pass никто не слушает: приложение не запущено, упало или слушает другой порт. Какие программы какие порты слушают, покажет команда:
sudo ss -ltnpПорт в выводе должен совпадать с портом в proxy_pass. Если приложения в списке нет, запустите его и посмотрите его журнал.
На обычном хостинге
На виртуальном хостинге PHP и веб-сервер настраивает хостер. Если 502 держится больше нескольких минут, напишите в поддержку адрес страницы и время ошибки. Что ещё проверить, рассказано в инструкции Что делать, если хостинг лежит.
502 и поиск Яндекса
По справке Яндекса, при ответе 502 сервер, работающий шлюзом или прокси, получил неправильный ответ от следующего сервера. Яндекс советует проверить, что все серверы в цепочке работают и правильно настроены, и проверить настройки прокси.
Чем 502 отличается от соседних кодов
| Код | Когда возникает |
|---|---|
| 500 | Ошибка в программе сайта: PHP или приложение ответили, но с ошибкой |
| 502 | Посредник не получил от следующего сервера нормального ответа |
| 503 | Сервер временно не может ответить: перегрузка или работы |
| 504 | Посредник не дождался ответа от следующего сервера |
Источники
- RFC 9110, раздел 15.6.3 — определение кода 502.
- Документация nginx: fastcgi_buffers и proxy_buffers.
- Исходный код nginx: ngx_http_upstream.c, ngx_http_fastcgi_module.c, ngx_event_connect.c и ngx_connection.c — строки журнала и их уровни.
- Исходный код PHP: образец настроек пула www.conf и fpm_process_ctl.c — pm.max_children и предупреждение о нём.
- Яндекс Вебмастер: коды ответа HTTP.
Сверено 7 октября 2026 года.
Что почитать дальше
- Ошибка 504 Gateway Timeout — когда nginx не дождался ответа.
- Ошибка 500 Internal Server Error — когда сломалась программа сайта.
- Как разместить сайт на VPS — настройка nginx с нуля.
- Что делать, если хостинг лежит — по шагам.
Проверено и обновлено: 07.10.2026