#Симптом и границы применимости
Если PHP-FPM сообщает ошибку bind() к Unix-сокету из-за прав доступа, обычно проблема в родительском каталоге для listen, владельце этого каталога или системном ограничении службы. Параметры listen.owner и listen.mode определяют права уже созданного сокета и сами по себе не исправляют запрет его создания.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нельзя создать файл в каталогеДля создания сокета службе необходим доступ к каталогу. | В журнале bind() Permission denied | Проверить владельца и разрешения родительского каталога |
| Родительский путь отсутствует после загрузкиПуть /run очищается при запуске ОС. | bind() No such file or directory | Проверить создание runtime-каталога |
| Системная политика или занятый адресЭто другая причина, чем chmod файла сокета. | audit сообщает denial либо bind() Address already in use | Посмотреть ограничения systemd/AppArmor/SELinux и процесс слушателя |
#Пошаговая диагностика и исправление
- Прочитайте полную ошибку запускаПодключитесь по SSH и запишите точное имя службы FPM. Выполните status и journalctl: ищите bind(), путь сокета и код Permission denied, No such file или Address already in use. Не удаляйте существующий сокет наугад, пока не проверили, принадлежит ли он живому процессу.
- Имя службы изменяется по версии PHP и панели; команда только для чтенияLinux · Терминал (Bash)КомандаНужен sudoИмя службы изменяется по версии PHP и панели; команда только для чтения.
sudo systemctl status php8.2-fpm --no-pager; sudo journalctl -u php8.2-fpm -n 100 --no-pager
- Узнайте действующее значение listenОткройте нужную секцию файла пула (например, /etc/php/8.2/fpm/pool.d/site.conf), посмотрите listen и проверьте, не используют ли два пула один адрес. Если путь не в /run/php, выясните, кто создаёт родительский каталог и владеет им.
- Проверьте все уровни каталогаПодставьте фактический путь listen в namei -l, отдельно проверьте ls -ld родительского каталога. Если недоступен /run/example, исправляйте именно создание и владельца этого каталога штатным способом; не меняйте права глобального /run.Linux · Терминал (Bash)КомандаПример пути; используйте фактический сокет. Только чтение.
namei -l /run/php/site.sock; ls -ld /run/php
- Проверьте, кто запускает службу и какие политики действуютВ systemd покажите User, Group и RuntimeDirectory выбранной службы. Управляющая панель может создавать отдельный пользовательский пул и каталог, поэтому не переназначайте файлы чужого сайта. На системах с SELinux/AppArmor используйте соответствующие журналы отказа.
- Пример Debian/systemd; некоторые параметры задаёт главный процесс FPMLinux · Терминал (Bash)КомандаПример Debian/systemd; некоторые параметры задаёт главный процесс FPM.
systemctl show php8.2-fpm -p User -p Group -p RuntimeDirectory -p RuntimeDirectoryMode
- Исправьте способ создания каталога, а не весь /runСделайте копию конфигурации. Если служба должна создавать каталог внутри /run, настройте его штатным механизмом RuntimeDirectory= либо tmpfiles.d согласно вашей системе и панели, с нужным владельцем и ограниченными правами. Для отдельного каталога используйте владельца основного процесса, который создаёт сокет. Не ставьте listen.mode=0777 ради запуска.
- Проверьте тест и повторный запускПроверьте конфигурацию FPM исполняемым файлом выбранной версии, затем перезапустите только этот экземпляр при согласованном перерыве. Посмотрите, что Unix-сокет создан, слушается нужным процессом и доступен веб-серверу.
- Дополнительная команда по темеLinux · Терминал (Bash)С осторожностьюНужен sudoПри использовании другой версии или отдельной панели измените команду; не перезапускайте при ошибке теста.
sudo php-fpm8.2 -t; sudo ss -xlpn | grep phpКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат
После контролируемого перезапуска сокет создаётся с ожидаемыми правами и PHP-запросы успешно обрабатываются; после перезагрузки системы каталог появляется автоматически.
#Если проблема не устранена
Если bind() всё ещё выдаёт Permission denied, проверьте обязательный контроль доступа и путь, а если Address already in use — какой процесс уже слушает адрес. Не удаляйте сокет активного пула.