#Симптомы и отличие от похожих неисправностей
Во время нагрузки PHP-FPM перестаёт быстро принимать новые соединения, в статусе растёт listen queue и фиксируется переполнение очереди входящих подключений. Разбираем связь listen.backlog, pm.max_children и ограничения ядра Linux. Очередь backlog — место для подключений, ожидающих принятия сервером, а не средство ускорения самих PHP-скриптов. Повышение listen.backlog может снизить краткие отказы, но увеличивает время ожидания и не устраняет перегруженные обработчики.
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Работники заняты длительными запросамиКогда все работники выполняют PHP-код, новые соединения задерживаются, очередь растёт. | В защищённом статусе idle processes=0, active processes близко к pm.max_children. | Сначала найти и ускорить тяжёлые обработчики. |
Ограничение очереди меньше реального краткого пикаlisten.backlog слишком мал для всплеска соединений, при этом свободная память и CPU есть. | Пик max listen queue доходит до listen queue len при кратких всплесках. | После измерения поднимать backlog небольшими шагами и наблюдать задержки. |
| Ограничение ядра или неверный экземпляр пулаЗначение backlog ограничивается системным somaxconn; Nginx подключается к иному сокету. | Изменения в пуле не отражаются на действующей очереди или ss показывает другую точку слушания. | Сверить активный listen и параметры ОС. |
#Диагностика и пошаговое устранение
- Подтвердите признаки очереди, не меняя параметры по одному 502В момент ошибки запишите время, количество обращений и код ответа Nginx. Ищите в error_log
connect() failed,upstream timed outилиno live upstreamsи уточните фактическую причину. Ответ 502 не доказывает переполнение backlog: он бывает при удалённом сокете, аварийном PHP и неверных разрешениях. Наблюдение проводите на рабочей нагрузке без искусственного усиления атаки или теста на отказ.
- Определите точный слушающий сокет PHP-FPMВ конфигурации виртуального сайта откройте
fastcgi_pass, а в действующем пуле —listen. Пути или адреса IP:порт должны совпадать. Если Nginx использует TCP, проверяйте TCP-очередь; если Unix-сокет — Unix-очередь. Не пытайтесь устанавливатьlisten.backlogв конфигурации Nginx: этот параметр относится к стороне PHP-FPM.
- Посмотрите статус пула, если он уже защищённо настроенЧерез закрытый адрес
pm.status_pathвыяснитеlisten queue,max listen queue,listen queue len,active processes,idle processesиmax children reached. Запишите значения до и во время пика;listen queue— текущая очередь,max listen queue— накопленный максимум. Если страницы статуса нет, сначала настройте её доступ только администратору, не открывайте всем. Насыщенная очередь при занятых работниках означает нехватку свободной обработки, а не обязательно маленький backlog.
- Проверьте очерёдность соединений и предел ядра LinuxПо SSH из терминала Windows/Linux выполните
ss -ltnдля TCP либоss -xlnдля Unix-сокетов, затемsysctl net.core.somaxconn. Для слушающих сокетовRecv-QиSend-Qпомогают оценить текущую очередь и предел, хотя формат зависит от типа.somaxconn— верхняя граница для backlog на Linux. Команды только читают данные; еслиssне найден, попросите администратора выполнить штатное средство диагностики. - Команды Linux для просмотра очередей и системного пределаLinux · Терминал (Bash)КомандаКоманды Linux для просмотра очередей и системного предела. Без sudo; не изменяют параметры ядра.
ss -ltnss -xlnsysctl net.core.somaxconn
- Разберите, почему работники не принимают новые запросыЕсли
active processesуже равноpm.max_childrenи растёт время ответа, найдите длительные операции в slowlog, журнале приложения или SQL. Проверьте внешние API и обработку архивов. Устранение длительного запроса эффективнее увеличения глубины очереди, в которой остальные посетители будут ждать те же занятые процессы. Подниматьpm.max_childrenбез проверки RAM нельзя.
- Сохраните конфигурацию и измените backlog только при измеренной необходимостиЕсли пиковая очередь действительно упирается в установленный размер, обработчики остаются работоспособными и есть кратковременный спрос, согласуйте увеличение
listen.backlogдо проверенного значения, например 256 или 512. Эти числа — примеры, не универсальные рекомендации. Убедитесь, что системныйnet.core.somaxconnне ниже выбранного значения; изменение системного лимита требует отдельной оценки со стороны администратора и не обязательно нужно. Запишите старое значение пула и сохраните его файл. - Пример кода по темеINIИллюстративный параметр активного пула; подбирайте после измерения и с учётом sysctl net.core.somaxconn.
listen.backlog = 256
- Протестируйте конфигурацию и примените её в окно обслуживанияДля Debian PHP 8.2 выполните
sudo php-fpm8.2 -t. Если ошибок нет, согласуйтеsudo systemctl reload php8.2-fpm. Для изменения слушающего сокета или некоторых пакетных сборок может потребоваться управляемый restart; это прервёт текущие запросы, и его нельзя делать в самый пик. Убедитесь, что после применения сокет существует, аssпоказывает ожидаемый предел. При несовпадении отмените правку и проверьте, тот ли файл пула меняли.Linux · Терминал (Bash)С осторожностьюНужен sudoDebian PHP 8.2: после успешного теста, права администратора. Перезапуск вместо reload только по подтверждённой необходимости и в согласованное окно. Команда перезагрузки выполняется только при успешной проверке конфигурации (оператор &&). При ошибке исправьте конфигурацию и повторите проверку; не запускайте перезагрузку вручную.sudo php-fpm8.2 -t && sudo systemctl reload php8.2-fpmКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Сравните задержки и число отказов при сопоставимом трафикеВ следующий сопоставимый период посмотрите максимум очереди, фактическое время ответа и 502/504. Если новые соединения принимаются, но долго ждут, значит backlog лишь сгладил отказ и нужен анализ длительности PHP-запросов. Если очередь стала больше, а время ответа ухудшилось, верните прежнее
listen.backlog, пройдите тест конфигурации и reload. Не включайте небезопасный тест высокой нагрузкой на боевом сайте.
#Как проверить результат и что предпринять при неуспехе
Успех — при сопоставимом пике снизилось число ошибок соединения, очередь не остаётся заполненной постоянно, время ответа приемлемо, процессы и RAM не исчерпываются. Если значения не меняются, проверьте sysctl, действующий пул, лимит процессов и источник длительных запросов; при ухудшении откатите изменения через резервную копию.