#Что означает ошибка
connect() to unix:/run/php/php-fpm.sock failed (13: Permission denied) while connecting to upstream
Nginx обращается к PHP-FPM через unix-сокет. Ошибка (13: Permission denied) означает, что у пользователя, от которого работает nginx, нет прав на файл сокета. Сокет создаёт PHP-FPM с владельцем и режимом, заданными в пуле (listen.owner, listen.group, listen.mode). Если nginx запущен от другого пользователя или группы, доступ запрещён. Посетитель видит 502 Bad Gateway.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неверные listen.owner и listen.groupСокет принадлежит другому пользователю. | ls -l показывает иного владельца. | Задайте владельца. |
| Другой пользователь у nginxnginx работает от nginx, а сокет для www-data. | ps показывает иного пользователя. | Согласуйте. |
| Неверный путь сокетаПути в nginx и PHP-FPM различаются. | Сокет не существует. | Исправьте путь. |
| SELinux блокируетКонтекст неверен. | В журнале AVC. | Исправьте контекст. |
#Пошаговое решение
- Прочитайте ошибкуПо SSH выполните
sudo tail -n 40 /var/log/nginx/error.logи найдите строкуconnect() to unix:/... failed (13: Permission denied). Выпишите точный путь сокета и время; сообщение может относиться не к Nginx→PHP, а к другому backend. Отдельно проверьте журнал PHP-FPM, чтобы не принять отсутствующий сокет за неверные разрешения. - Найдите сокетВыполните
ls -l /run/php/илиstat /фактический/путь/к/сокету, подставив путь из журнала. В выводе посмотрите владельца, группу и режим сокета; файл может пересоздаваться после запуска пула. Если сокета нет, проверяйте работающую службу и параметрlisten, а не меняйте права на несуществующий объект. - Определите пользователя nginxНайдите директиву
userв основном конфигурационном файле Nginx черезsudo nginx -T 2>/dev/null | head -n 30. На Debian/Ubuntu часто этоwww-data, на других системах —nginxлибо другой пользователь; на панели хостинга схема может отличаться. Выясните, в какую группу он входит (id имя_пользователя) и может ли открыть сокет. - Проверьте пулОткройте файл конфигурации нужного пула PHP-FPM (
/etc/php/8.2/fpm/pool.d/www.conf— пример, версия должна совпадать с вашей) и найдитеlisten,listen.owner,listen.group,listen.mode. Сравните путь сfastcgi_passв Nginx и права с его системным пользователем. Сохраните копию перед любыми правками. - Задайте праваЕсли подтверждён отказ чтения сокета, настройте группу и разрешения по модели сервера: например,
listen.owner = www-data,listen.group = www-data,listen.mode = 0660только когда Nginx действительно работает подwww-data. Не задавайте режим0666и не исправляйте разрешения вручную на временном файле сокета; после перезапуска их установит FPM. - Проверьте путьВ конфигурации сайта найдите
fastcgi_pass unix:/run/php/...sock;и сравните символ в символ сlistenнужного пула. При работе через TCP вместо сокета адрес и порт тоже должны совпадать. Если у одного домена собственный пул, не перенаправляйте его на общий пул без понимания изоляции сайтов. После исправления выполнитеnginx -tи проверку конфигурации PHP-FPM. - Перезапустите службыСначала выполните
sudo php-fpm8.2 -t(или установленную команду проверки вашей версии), затем штатно перезагрузите PHP-FPM, если меняли пул. Для Nginx выполнитеsudo nginx -t && sudo systemctl reload nginx; не делайтеrestart nginxбез необходимости. Откройте проблемную страницу и новый error.log; при ошибке верните конфигурацию из копии. - Проверьте SELinuxНа RHEL/AlmaLinux/Rocky при SELinux Enforcing изучите журнал AVC через
sudo ausearch -m AVC -ts recentи контексты сокетаls -Z. При подтверждённом отказе исправляйте политику и контекст по документации дистрибутива; не выключайте SELinux и не применяйтеrestorecon -Rvк неизвестному каталогу без проверки политики. На Debian проверьте AppArmor, если установлен. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
Если вы изменили версию PHP, не забудьте обновить имя сокета в конфигурации nginx (php8.3-fpm.sock). Для нескольких сайтов создавайте отдельные пулы и сокеты, а группу nginx добавьте в группу пула (usermod -aG). Альтернатива сокету — TCP (listen = 127.0.0.1:9000), она проще в настройке, но чуть медленнее и открыта локально. После изменений проверьте работу сайта и журнал ошибок. Для CentOS и AlmaLinux при включённом SELinux может понадобиться setsebool -P httpd_can_network_connect 1. Справка — .