Ошибка 502 Bad Gateway: как перезапустить Nginx и PHP-FPM в Linux для чайников
Что означает код ошибки 502 Bad Gateway?
Ошибка 502 Bad Gateway (Плохой шлюз) означает, что внешний веб-сервер (обычно Nginx) работает исправно и принял запрос пользователя, но внутренний бэкенд (обработчик скриптов PHP-FPM, Node.js, Gunicorn или Apache) упал, завис от перегрузки или не слушает сетевой сокет.
Схема взаимодействия при ошибке 502:
Браузер клиента ---[ Запрос ]---> Nginx (Работает) ---[ X Нет ответа X ]---> PHP-FPM (Упал / Завис)
Браузер клиента <---[ 502 Bad Gateway ]--- NginxПричины падения бэкенда:
- Служба
php-fpmаварийно остановилась из-за нехватки оперативной памяти (OOM Killer). - Превышен лимит выделенной памяти скрипту (
memory_limit). - Переполнен пул рабочих процессов (
pm.max_children reached). - Неправильные права доступа к UNIX-сокету
/run/php/php-fpm.sock.
Пошаговое восстановление работы сайта за 3 шага
- Шаг 1. Проверяем статус и перезапускаем службу PHP-FPM:
Узнаем точную версию PHP и перезапускаем службу обработчика:
# Проверка статуса (для Ubuntu/Debian): sudo systemctl status php*-fpm # Перезапуск службы PHP-FPM (например, PHP 8.2): sudo systemctl restart php8.2-fpm # Для CentOS / RHEL (AlmaLinux): sudo systemctl restart php-fpm - Шаг 2. Проверяем статус и конфигурацию Nginx:
Перед перезапуском Nginx обязательно протестируйте файлы конфигурации на синтаксические ошибки:
# Тест конфигурации: sudo nginx -t # Если вывод 'syntax is ok', безопасно перезапускаем: sudo systemctl restart nginx - Шаг 3. Анализируем логи ошибок для поиска первопричины:
Если после перезапуска сайт снова падает в 502, откройте последние строки журнала ошибок:
# Смотрим ошибки Nginx: sudo tail -n 50 /var/log/nginx/error.log # Смотрим системный журнал PHP: sudo journalctl -u php8.2-fpm -n 50 --no-pager - Исправление ошибки сокета (connect() to unix:... failed (13: Permission denied)):
Если в логе Nginx написано Permission denied к сокету PHP, исправьте владельца в файле
/etc/php/8.2/fpm/pool.d/www.conf:listen.owner = www-data listen.group = www-data listen.mode = 0660После правок выполните:
sudo systemctl restart php8.2-fpm.
Совет: Если PHP-FPM падает регулярно при наплыве посетителей, увеличьте параметр pm.max_children в конфигурационном файле пула www.conf и добавьте серверу Swap-файл подкачки.
Частые вопросы (FAQ)
В чем разница между ошибкой 502 и 504 Gateway Timeout?
Ошибка 502 означает, что бэкенд мгновенно сбросил соединение или выключен. Ошибка 504 означает, что бэкенд работает, но выполнял тяжелый скрипт слишком долго и превысил лимит ожидания (max_execution_time).
Что делать, если systemctl status показывает, что PHP-FPM 'Active (running)', но 502 ошибка остается?
Проверьте путь к сокету в конфигурационном файле виртуального хоста Nginx (директива `fastcgi_pass`). Путь должен строго совпадать со строкой `listen` в файле `www.conf`.
Как предотвратить убийство PHP системным OOM Killer?
Добавьте файл подкачки (Swap) размером 2–4 ГБ и оптимизируйте лимит памяти PHP `memory_limit = 256M` в файле `php.ini`.
Как перезагрузить конфигурацию Nginx без обрыва текущих сессий пользователей?
Используйте команду `sudo nginx -s reload` или `sudo systemctl reload nginx` вместо команды restart.