Ошибка 502 Bad Gateway в Nginx: причины и быстрое решение
Что означает ошибка 502 Bad Gateway?
Код ответа 502 Bad Gateway означает, что фронтенд веб-сервер Nginx работает штатно, но бэкенд (сервер приложений, обрабатывающий код сайта — PHP-FPM, Node.js, Python/Gunicorn) упал, выключен или не отвечает на запросы.
Алгоритм устранения ошибки 502
- Проверьте лог ошибок Nginx для выявления точной причины:
sudo tail -n 20 /var/log/nginx/error.log - Случай А: Упала служба PHP-FPM (самая частая причина):
Проверьте статус и запустите PHP-FPM заново (подставьте вашу версию PHP):
# Проверка статуса: sudo systemctl status php8.2-fpm # Перезапуск службы: sudo systemctl restart php8.2-fpm - Случай Б: Неправильный путь к сокету в конфигурации Nginx:
Откройте конфиг сайта
sudo nano /etc/nginx/sites-available/mysite.confи проверьте блокfastcgi_pass. Путь должен точно совпадать с установленной версией:fastcgi_pass unix:/run/php/php8.2-fpm.sock; - Случай В: Упало приложение Node.js / Python:
Перезапустите ваш процесс-менеджер (например, PM2 или службу systemd):
pm2 restart all # или sudo systemctl restart gunicorn - Примените настройки веб-сервера:
sudo nginx -t && sudo systemctl reload nginx
Нехватка оперативной памяти (OOM Killer): Если PHP-FPM падает регулярно при наплыве посетителей, проверьте системный лог: sudo dmesg -T | grep -i oom. Возможно, процесс был убит ядром из-за нехватки RAM.
Частые вопросы (FAQ)
В чем отличие ошибки 502 от 504 Gateway Time-out?
Ошибка 502 означает, что бэкенд мгновенно вернул ошибку или вообще не запущен (connection refused). Ошибка 504 означает, что бэкенд запущен, но выполнял тяжелый скрипт слишком долго и превысил лимит ожидания.
Как узнать, какая именно версия PHP-FPM установлена на сервере?
Выполните команду: ls /run/php/ или dpkg -l | grep php.*fpm.
Что делать, если в логах Nginx ошибка connect() to unix:/... failed (13: Permission denied)?
У веб-сервера Nginx нет прав на чтение сокета. Убедитесь, что в файле /etc/php/X.X/fpm/pool.d/www.conf раскомментированы строки listen.owner = www-data и listen.group = www-data.
Как перезапустить сразу все версии PHP на сервере?
Выполните команду: sudo systemctl restart php*-fpm.