#Что происходит и когда применима инструкция
Пул PHP-FPM может запускать обработчики от имени не того пользователя, который владеет каталогами проекта: запись файлов прекращается, а один сайт неожиданно получает доступ к чужим данным. Важно не путать пользователя дочерних процессов с владельцем Unix-сокета и с основным процессом PHP-FPM.
#Причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Директива user или group выбрана неверноДиректива user или group выбрана неверно. Проверка процессов показывает иной UID или GID, чем планировалось для данного приложения. | Проверка процессов показывает иной UID или GID, чем планировалось для данного приложения. | Сопоставить конфигурацию пула и работающие процессы. |
| Веб-сервер подключён к чужому пулуВеб-сервер подключён к чужому пулу. Запросы одного сайта выполняются с правами другого, хотя конфигурация своего пула верна. | Запросы одного сайта выполняются с правами другого, хотя конфигурация своего пула верна. | Проверить fastcgi_pass или SetHandler и путь listen. |
| Права сокета перепутаны с правами приложенияПрава сокета перепутаны с правами приложения. Ошибка подключения 502 возникает до выполнения PHP; chmod файлов приложения её не меняет. | Ошибка подключения 502 возникает до выполнения PHP; chmod файлов приложения её не меняет. | Разделить listen.owner/group/mode и user/group процесса. |
#Подробная пошаговая инструкция
- Установите, какой сайт и какой пул действительно обрабатывают запросИз панели хостинга найдите версию PHP и связанный с сайтом пул. При ручной настройке откройте конфигурацию виртуального хоста и найдите fastcgi_pass (Nginx) либо SetHandler/proxy:fcgi (Apache). Запишите socket/порт и найдите совпадающую строку listen в файлах pool.d; не ориентируйтесь только на название пула.
- Дополнительная команда по темеLinux · Терминал (Bash)КомандаНужен sudoВ SSH на Debian/Ubuntu от администратора: вывести определения пулов и пользователей, не меняя файлов. На иных системах путь другой. Не публикуйте полный вывод со служебной информацией.
sudo grep -R -nE "^\s*(\[|listen\s*=|user\s*=|group\s*=|listen\.(owner|group|mode)\s*=)" /etc/php/*/fpm/pool.d/*.conf
- Сравните с реально работающими процессамиОткройте SSH и выполните команду ниже. Основной процесс часто запущен от root — это нормально; нужны дочерние обработчики с пометкой «pool НАЗВАНИЕ». Если у них неожиданный пользователь, настройки не применились или используется другой экземпляр службы.
- Только чтение списка процессовLinux · Терминал (Bash)КомандаТолько чтение списка процессов. Сверяйте строку pool и владельца с user/group в конфигурации.
ps -eo user,group,pid,ppid,args | grep -E "[p]hp-fpm|[p]hp.*fpm"
- Проверьте доступ к нужным каталогам без расширения прав всемДля каталога, куда PHP должен сохранять данные, посмотрите владельца, группу, цепочку родительских каталогов и правила доступа. Если вы не администратор сервера, передайте результаты хостеру; не назначайте chmod 777 и не запускайте все сайты от root.
- В SSH замените пример пути реальнымLinux · Терминал (Bash)КомандаВ SSH замените пример пути реальным. namei покажет права на каждом компоненте, ls — права целевого каталога; команда ничего не изменяет.
namei -l /var/www/example/public/uploads; ls -ld /var/www/example/public/uploads
- Исправьте только подтверждённую ошибку и сохраните резервную копиюЕсли user/group в нужном pool.d действительно неверны, скопируйте именно этот файл в защищённое место, затем поменяйте значения на учётную запись, предназначенную для сайта. При отдельном доступе веб-сервера к сокету настройте listen.owner и listen.group независимо. У нескольких сайтов должны быть свои права, но пул сам по себе не равнозначен контейнерной изоляции.
- Проверьте конфигурацию до применения и перезапустите лишь нужную службуКоманда теста зависит от версии и установки PHP. В Debian пример для 8.2 приведён ниже; если другой путь или версия, выясните имя исполняемого файла через панель или пакетный менеджер. Только после успешного теста применяйте изменения в согласованное окно.
- SSH, права администратораLinux · Терминал (Bash)С осторожностьюНужен sudoSSH, права администратора. -t проверяет конфигурацию; reload перечитывает её и может переинициализировать обработчики. Пример для установленного php8.2-fpm, подставьте свою версию.
sudo php-fpm8.2 -t && sudo systemctl reload php8.2-fpmКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Проверьте работоспособность сайта и возможность записиОткройте обычную страницу, выполните штатную загрузку небольшого тестового файла там, где она предусмотрена. Убедитесь, что у других сайтов не возникли 502 и что созданный файл доступен только нужному приложению; затем удалите тест через интерфейс сайта.
#Как проверить, что проблема исправлена
Пользователь дочернего процесса совпадает с назначенным, сайт выполняет операции записи без 403/500, соседние сайты не затронуты, а подключение к FastCGI-сокету работает.
#Если не помогло — дальнейшая диагностика и откат
Если имя пользователя верно, но запись не проходит, ищите ограничения open_basedir, ACL, SELinux/AppArmor или владельца каталога. При 502 после изменения восстановите сохранённый pool.d, выполните тест -t и перезагрузите службу в установленном порядке.