PHP-FPM Linux

PHP-FPM: запросы выполняются медленно, в логе slowlog

  • Обновлено
  • Чтение ≈ 5 минут
  • Нужны права администратора

Краткий ответ

Медленные запросы и таймауты в PHP-FPM (502/504) исправляются включением slowlog, настройкой request_terminate_timeout, fastcgi_read_timeout в nginx, оптимизацией запросов к БД и проверкой внешних API. Найдите медленный скрипт по трассировке slowlog.

В этой статье
  1. Что происходит
  2. Причины
  3. Порядок
  4. Когда увеличение таймаутов оправдано
PHP-FPM timeout
504 Gateway Time-out / upstream timed out (110: Connection timed out) while reading response header from upstream
По-русскиЗапрос к PHP выполняется слишком долго, nginx обрывает соединение.

#Что происходит

Nginx передаёт запрос в PHP-FPM и ждёт ответа не дольше fastcgi_read_timeout (по умолчанию 60 секунд). Если PHP не успел, nginx отвечает 504, в журнале появляется upstream timed out. Сам PHP-FPM может прервать процесс по request_terminate_timeout, и тогда будет 502. Увеличение таймаутов лишь скрывает симптом: нужно найти, почему скрипт выполняется долго — тяжёлый запрос к базе данных, внешний API, блокировка файла, цикл без ограничения.

#Причины

Возможная причинаКак узнатьЧто делать
Медленный SQL-запросНет индексов.Slowlog показывает mysqli_query/PDO::query.Добавьте индексы, оптимизируйте запрос.
Внешний API недоступенНет таймаутов в cURL.Slowlog показывает curl_exec.Задайте таймауты, кеш.
Тяжёлая операция в запросеИмпорт, генерация отчётов.Всегда около лимита.Вынесите в очередь.
Нехватка процессовОчередь запросов.Много 504 в пики.См. настройку max_children.
БлокировкиСессии PHP, файлы.Параллельные запросы одного пользователя висят.session_write_close(), Redis для сессий.
Перегрузка сервераCPU/диск.Всё медленно.Мониторинг, апгрейд.

#Порядок

  1. Определите, какие URL медленныеНа сервере с доступом SSH откройте терминал и посмотрите журнал доступа nginx, если он уже содержит $request_time и $upstream_response_time. Если нет — попросите администратора добавить отдельный формат времени ответа (пример ниже) после резервной копии конфигурации и nginx -t. Воспроизведите медленное обращение, сравните URL, время и код HTTP. Не делайте вывод о причине из одного случайного долгого запроса.
  2. Включите slowlog в пуле PHP-FPMНайдите конфигурацию активного пула PHP-FPM (/etc/php/8.2/fpm/pool.d/*.conf на части Debian/Ubuntu; версия и путь могут отличаться). Сохраните копию файла. Добавьте в секцию нужного пула request_slowlog_timeout = 5s и slowlog = /var/log/php8.2-fpm.slow.log, предварительно убедившись, что каталог доступен службе. Проверьте синтаксис sudo php-fpm8.2 -t и выполните sudo systemctl reload php8.2-fpm; на хостинге с панелью меняйте параметры через неё.
  3. Прочитайте трассировки: они покажут функцию, в которой «застрял» скриптВоспроизведите медленный URL и выполните sudo tail -n 60 /var/log/php8.2-fpm.slow.log по реальному пути файла. Найдите время запроса и строки PHP backtrace: путь и функция показывают, где выполнение задержалось, но не всегда первопричину. Если журнал пуст, проверьте, что изменён именно работающий пул, порог 5 секунд превышался и PHP-FPM смог создать файл. Не публикуйте журнал с путями и персональными данными.
  4. Проверьте медленные запросы MySQLЕсли трассировка указывает на работу с базой, откройте журнал медленных запросов MySQL/MariaDB. Не включайте глобальные параметры на чужом сервере без согласования: при наличии прав администратора сначала проверьте SHOW VARIABLES LIKE "slow_query_log"; и путь журнала; при необходимости включите запись на короткий период и оцените её размер. Используйте EXPLAIN для конкретного медленного SELECT на копии или в безопасном режиме. Не добавляйте индексы вслепую.
  5. Проверьте внешние запросыЕсли в трассировке видны curl_exec, HTTP-клиент или запрос к API, найдите соответствующий адрес в настройках приложения и проверьте его доступность с сервера, например curl -I --max-time 10 https://адрес-сервиса/ (замените только на реальный доверенный адрес). Сравните время ответа и сообщение об ошибке; 403/401 — не таймаут, а отдельная причина. Не отключайте проверку TLS и не сохраняйте ключи API в открытых журналах.
  6. Временно увеличьте таймауты в nginx и PHP-FPM для длинных задачТаймауты увеличивайте только если установлено, что запрос действительно должен долго работать и серверу хватает ресурсов. В конфигурации nginx меняется fastcgi_read_timeout, в пуле PHP-FPM — request_terminate_timeout; это разные ограничения. Сохраните старые значения, проверьте синтаксис (nginx -t, php-fpm8.2 -t) и примените перезагрузку конфигурации каждой службы отдельно. Если нагрузка растёт или запрос зависает бесконечно — верните прежние значения.
  7. Для тяжёлых операцийДля регулярного формирования отчётов, импорта и рассылки лучше перенести длительную задачу из веб-запроса в фоновую очередь либо задание cron с контролем доступа. Сначала убедитесь, что приложение поддерживает этот способ: произвольный запуск веб-скрипта из cron может дублировать операции. Настройте расписание в панели хостинга, команду с абсолютным путём к нужной версии PHP и отдельный журнал выполнения, затем проверьте одно тестовое задание.
  8. Проверьте нагрузку CPU/диска и количество процессовВо время замедления посмотрите загрузку сервера: в SSH выполните uptime, free -h, df -h и ps -eo pid,pcpu,pmem,cmd --sort=-pcpu | head; команды ничего не меняют. Сопоставьте процессы PHP с количеством запросов и сообщениями pm.max_children в журнале. Если память заканчивается или есть ожидание диска, увеличение числа процессов усугубит ситуацию; сохраните замеры и проверьте приложение и базу данных.
  9. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Включить журнал медленных запросов и ограничение времени
    INIКоманда
    Включить журнал медленных запросов и ограничение времени
    request_slowlog_timeout = 5s
    slowlog = /var/log/php8.2-fpm.slow.log
    request_terminate_timeout = 120s
    Вариант 2Таймауты nginx для PHP-FPM (увеличивайте только для нужных location)
    NginxКоманда
    Таймауты nginx для PHP-FPM (увеличивайте только для нужных location)
    location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    fastcgi_read_timeout 120s;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    Вариант 3Формат журнала с временем ответа (request_time) и временем PHP (upstream_response_time)
    NginxКоманда
    Формат журнала с временем ответа (request_time) и временем PHP (upstream_response_time)
    log_format timing '$remote_addr [$time_local] "$request" $status $request_time $upstream_response_time';
    access_log /var/log/nginx/access_timing.log timing;
    Вариант 4Самые медленные запросы за сегодня
    Linux · Терминал (Bash)Команда
    Самые медленные запросы за сегодня
    awk '{print $(NF-1), $7}' /var/log/nginx/access_timing.log | sort -nr | head -15
    Вариант 5Применить конфигурацию и прочитать slowlog
    Linux · Терминал (Bash)КомандаНужен sudo
    Применить конфигурацию и прочитать slowlog
    sudo php-fpm8.2 -t && sudo systemctl reload php8.2-fpm
    sudo nginx -t && sudo systemctl reload nginx
    sudo tail -n 60 /var/log/php8.2-fpm.slow.log
    Вариант 6MySQL: включить журнал медленных запросов (запросы дольше 1 секунды)
    SQLКоманда
    MySQL: включить журнал медленных запросов (запросы дольше 1 секунды)
    SHOW VARIABLES LIKE "slow_query_log";
    SHOW VARIABLES LIKE "slow_query_log_file";
    SHOW GLOBAL STATUS LIKE "Slow_queries";

#Когда увеличение таймаутов оправдано

Для импортов и резервных копий допустимо поднять таймаут именно для их адреса: отдельный location /admin/import { fastcgi_read_timeout 600s; }. Для остального сайта оставьте умеренные значения. Бесконечные таймауты исчерпывают пул процессов и делают сайт уязвимым к перегрузке.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.