PHP-FPM Ошибка: unable to bind listening socket for address (Unix Socket / Port)
Механизм создания и привязки коммуникационных сокетов 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 Socket | listen = /run/php/php-fpm.sock | Максимальная производительность (меньше latency), требует настройки прав listen.owner. |
| TCP Socket | listen = 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: Небезопасная настройка, открывающая доступ к сокету исполнения кода любому локальному пользователю системы.
Эксперты ITSTM проведут правильную интеграцию Nginx и 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, а не обычным файлом).