Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
PHP-FPM-ERR-SOCKET-BIND Linux / DevOps

PHP-FPM Ошибка: unable to bind listening socket for address (Unix Socket / Port)

Обновлено: 21.08.2026  ·  Официальная база знаний

Механизм создания и привязки коммуникационных сокетов FastCGI

Для взаимодействия с веб-сервером (Nginx/Apache) мастер-процесс PHP-FPM создает точку приема соединений (Listening Endpoint). Это может быть локальный сетевой Unix Domain Socket (файл сокета, например /run/php/php8.2-fpm.sock) или сетевой TCP Socket (например, 127.0.0.1:9000). При старте мастер-процесс выполняет системные вызовы socket() и bind(). Если целевой файл сокета заблокирован, родительский каталог не существует, отсутствуют права на создание файла или TCP-порт уже занят другим процессом, FPM падает с критической ошибкой:

«ERROR: unable to bind listening socket for address '/run/php/php8.2-fpm.sock': Permission denied (13)»
или
«ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)»

Бизнес-риски

Полный отказ веб-стека, невозможность запуска PHP-FPM после перезагрузки сервера, циклическое падение службы (CrashLoopBackOff в Kubernetes).

Сравнение Unix Domain Socket и TCP Socket

Тип подключенияКонфигурация в пулеПреимущества и нюансы
Unix Socketlisten = /run/php/php-fpm.sockМаксимальная производительность (меньше latency), требует настройки прав listen.owner.
TCP Socketlisten = 127.0.0.1:9000Простота масштабирования по сети (Docker / микросервисы), возможен конфликт занятых портов.

Регламент исправления прав на сокеты и освобождения портов

Сценарий 1: Исправление прав доступа на Unix Domain Socket

Если веб-сервер Nginx (работающий от www-data или nginx) не может подключиться к сокету или FPM не может создать сокет в каталоге:

# 1. Проверьте существование системного каталога под сокеты:
sudo mkdir -p /run/php/
sudo chown -R www-data:www-data /run/php/
sudo chmod 755 /run/php/

# 2. Настройте права владельца сокета в конфигурации пула:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf

# Задайте корректные параметры сокета:
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

# 3. Перезапустите службу и проверьте созданный сокет:
sudo systemctl restart php8.2-fpm
ls -la /run/php/php8.2-fpm.sock
# Ожидаемый вывод: srw-rw---- 1 www-data www-data ... /run/php/php8.2-fpm.sock

Сценарий 2: Разрешение конфликта портов «Address already in use» (TCP 9000)

# 1. Поиск процесса, занявшего целевой TCP-порт 9000:
sudo ss -tulpn | grep :9000
# или:
sudo lsof -i :9000

# 2. Если порт занят зависшим старым процессом php-fpm -> принудительно завершите его:
sudo killall -9 php-fpm

# 3. Если порт занят другим сервисом (например, Xdebug или сторонней службой), измените порт в пуле на 9001:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
listen = 127.0.0.1:9001

# 4. Обновите порт в конфигурации Nginx (fastcgi_pass 127.0.0.1:9001;) и перезапустите: 
sudo systemctl restart php8.2-fpm
sudo systemctl reload nginx

Сценарий 3: Удаление «зависшего» файла сокета после аварийного отключения сервера

# Если служба остановлена, но старый файл сокета остался на диске:
sudo systemctl stop php8.2-fpm
sudo rm -f /run/php/php8.2-fpm.sock
sudo systemctl start php8.2-fpm

Типовые ошибки администраторов

  • Размещение сокета в каталоге /tmp: В Systemd включена директива PrivateTmp=true для сервисов, из-за чего Nginx и PHP-FPM видят разные изолированные каталоги /tmp и сокет становится недоступен. Размещайте сокеты строго в /run/php/.
  • Установка listen.mode = 0777: Небезопасная настройка, открывающая доступ к сокету исполнения кода любому локальному пользователю системы.
Веб-сервер выдает 502 Bad Gateway из-за ошибок подключения к сокету PHP?
Эксперты ITSTM проведут правильную интеграцию Nginx и PHP-FPM, изолируют сокеты безопасности и оптимизируют сетевой стек.
Практический опыт инженера: При высоких нагрузках (более 5000 RPS) стандартная очередь сокета переполняется. Обязательно увеличьте системный лимит ядра sysctl net.core.somaxconn=65535 и установите параметр listen.backlog = 65535 в пуле PHP-FPM.

Частые вопросы (FAQ)

Почему каталог /run/php/ исчезает после перезагрузки сервера?

Каталог /run смонтирован в оперативной памяти tmpfs. Для автоматического пересоздания папки при загрузке создайте файл конфигурации systemd-tmpfiles: echo 'd /run/php 0755 www-data www-data -' | sudo tee /etc/tmpfiles.d/php-fpm.conf.

Что быстрее: Unix Socket или TCP сокет 127.0.0.1?

Unix сокет быстрее на 15-25%, так как передача данных происходит напрямую через память ядра без накладных расходов на сетевой стек TCP/IP, контрольные суммы и проверку портов.

Как подключить Nginx к сокету, если Nginx работает от nginx, а FPM от www-data?

Добавьте пользователя nginx в группу www-data: sudo usermod -aG www-data nginx и задайте listen.mode = 0660 в пуле FPM.

Что означает префикс s в выводе ls -la для файла сокета?

Флаг 's' в начале прав (srw-rw----) означает специальный тип файла Unix Domain Socket (создается системным вызовом socket, а не обычным файлом).