Ошибка 502 Bad Gateway в Nginx и PHP-FPM: как найти причину и починить
Что означает ошибка 502 Bad Gateway?
Веб-сервер Nginx работает в роли шлюза (Reverse Proxy): он принимает запрос из интернета и передает его обработчику PHP (службе PHP-FPM). Ошибка 502 Bad Gateway означает, что Nginx обратился к PHP-FPM, но тот либо упал, либо завис от перегрузки, либо недоступен по сокету/порту.
| Запись в /var/log/nginx/error.log | Что это значит простыми словами | Способ устранения |
|---|---|---|
connect() to .../php-fpm.sock failed (2: No such file or directory) | Служба PHP-FPM выключена или не создала unix-сокет | Запустить службу PHP-FPM или исправить путь к сокету |
connect() failed (111: Connection refused) | PHP-FPM должен слушать TCP-порт (127.0.0.1:9000), но порт закрыт | Проверить параметр listen в www.conf |
upstream prematurely closed connection while reading response header | Скрипт PHP упал по нехватке памяти (Out of Memory) или сработал SIGSEGV | Увеличить memory_limit в php.ini |
Пошаговый алгоритм устранения ошибки 502
Шаг 1: Проверяем статус службы PHP-FPM
Узнайте версию установленного PHP и проверьте его статус (замените 8.2 на вашу версию):
sudo systemctl status php8.2-fpm # Если служба остановлена, запускаем ее: sudo systemctl restart php8.2-fpmШаг 2: Читаем последние строки лога ошибок Nginx
sudo tail -n 20 /var/log/nginx/error.logШаг 3: Сверяем путь к сокету в конфигурации
Откройте файл виртуального хоста вашего сайта (например,
/etc/nginx/sites-available/default) и проверьте блок fastcgi_pass:location ~ \.php$ { include snippets/fastcgi-php.conf; # Путь должен в точности совпадать с реальным файлом в /run/php/: fastcgi_pass unix:/run/php/php8.2-fpm.sock; }Проверьте синтаксис и перезапустите Nginx:
sudo nginx -t && sudo systemctl restart nginx.Шаг 4: Увеличиваем лимиты пула процессов при высокой нагрузке
Если 502 ошибка появляется только при наплыве посетителей, откройте
/etc/php/8.2/fpm/pool.d/www.confи увеличьте количество воркеров:pm = dynamic pm.max_children = 50 pm.start_servers = 10 pm.min_spare_servers = 5 pm.max_spare_servers = 20
Совет: Всегда проверяйте оперативную память сервера командой free -m. Если свободная память (available) приближается к 0, Linux OOM Killer аварийно убивает процессы PHP-FPM.
Частые вопросы (FAQ)
В чем разница между ошибками 502 Bad Gateway и 504 Gateway Timeout?
Ошибка 502 означает, что бэкенд (PHP-FPM) моментально сбросил соединение или выключен. Ошибка 504 означает, что PHP-FPM принял запрос, но выполнял тяжелый скрипт слишком долго и превысил лимит ожидания (max_execution_time).
Что делать, если при перезапуске PHP-FPM выдает ошибку сокета?
Проверьте права доступа на файл сокета в <code>/etc/php/8.2/fpm/pool.d/www.conf</code>: параметры <code>listen.owner = www-data</code> и <code>listen.group = www-data</code> должны быть раскомментированы.
Как перезапустить связку Nginx + PHP-FPM одной командой?
Выполните: <code>sudo systemctl restart php*-fpm nginx</code>.
Как узнать, какая именно версия PHP-FPM установлена на сервере?
Выполните команду: <code>php -v</code> или просмотрите список установленных служб: <code>systemctl list-units | grep fpm</code>.