502 Bad Gateway на Nginx + WordPress — как исправить
Где именно проблема
Nginx — это прокси. Он принимает HTTP-запрос и передаёт PHP-FPM. Если PHP-FPM молчит — Nginx показывает 502.
Четыре причины — от самой частой к редкой:
- PHP-FPM упал. Перезагрузка сервера, кончилась память, кривая конфигурация после обновления PHP.
- Сокет не совпадает. Nginx и PHP-FPM настроены на разные сокеты — частая проблема после переустановки PHP или смены версии (7.4 → 8.2).
- Таймаут. Скрипт выполняется дольше, чем настроено в
request_terminate_timeout. Типично для WooCommerce, импорта, генерации отчётов. - Перегруз. Все дочерние процессы PHP-FPM заняты. Новые запросы встают в очередь, Nginx отдаёт 502 не дожидаясь.
Диагностика
1. Жив ли PHP-FPM
systemctl status php8.2-fpm
Упал — запускаем: systemctl start php8.2-fpm. Не запускается — смотрим логи: tail -50 /var/log/php8.2-fpm.log. Если в логах cannot bind socket — порт занят другим процессом.
2. Сокет
Nginx должен стучаться туда же, где слушает PHP-FPM. Проверьте совпадение:
# В nginx (location ~ \.php$):
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
# В PHP-FPM (/etc/php/8.2/fpm/pool.d/www.conf):
listen = /run/php/php8.2-fpm.sock
Несовпадение — самая частая причина 502 после переустановки PHP.
www-data. Сокет должен быть доступен этому пользователю. Проверьте: ls -la /run/php/php8.2-fpm.sock. Владелец — www-data. Если нет — chown www-data:www-data /run/php/php8.2-fpm.sock.
3. Таймауты
502 появляется только на тяжёлых страницах (админка, WooCommerce-чекаут)? Добавьте в nginx:
fastcgi_read_timeout 300s;
И в PHP-FPM (www.conf):
request_terminate_timeout = 300s
4. Не хватает процессов
Если 502 возникает периодически в пиковые часы — PHP-FPM не справляется с нагрузкой. Проверьте настройки пула:
# /etc/php/8.2/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 20 # макс. процессов
pm.start_servers = 4 # стартует при запуске
pm.min_spare_servers = 2 # держит про запас
pm.max_spare_servers = 8 # не больше при простое
Ориентир: каждый PHP-FPM процесс потребляет 30-80 MB RAM. Если pm.max_children = 20 — нужно минимум 1.5 GB свободной памяти. На VPS с 2 GB RAM ставьте не больше 15.
test.php с <?php phpinfo(); в корне сайта. Открывается — проблема в WordPress (тяжёлый плагин). Тоже 502 — проблема в связке Nginx + PHP-FPM. Это сразу отсекает половину гаданий.
Когда способ не сработает
- 502 после перезагрузки сервера. PHP-FPM стартует позже Nginx и не успевает создать сокет. Решение:
systemctl enable php8.2-fpmплюс перезапуск Nginx после старта PHP-FPM (ExecStartPost=/bin/sleep 2 && /usr/sbin/nginx -s reloadв systemd-юните). - 502 при OOM (Out of Memory). Ядро убило PHP-FPM потому что RAM кончилась. Проверьте:
dmesg | grep -i "killed process". Если там php-fpm — добавьте swap или RAM. - 504 вместо 502. Если ошибка 504 Gateway Timeout, а не 502 — проблема в таймауте. Те же исправления по таймаутам (шаг 3), но причина другая: ответ от PHP-FPM идёт слишком долго.
Частые вопросы
pm.max_children. Следите за htop — если память в ноль, нужно больше RAM.Не получается найти причину?
Проверю сервер, php-fpm pool, таймауты и исправлю. Обычно хватает часа.