Nginx 502 Bad Gateway: php-fpm.sock Permission denied — Исправление
Nginx не может передать FastCGI-запрос пулу PHP-FPM через UNIX-сокет. Пользователь видит ошибку 502 Bad Gateway, а в /var/log/nginx/error.log записывается: connect() to unix:/var/run/php/php-fpm.sock failed (13: Permission denied) while connecting to upstream.
| Пользователь Nginx | Владелец сокета PHP-FPM | Результат доступа |
|---|---|---|
www-data (или nginx) | root:root (0600) | 13: Permission denied |
nginx | apache:apache (0660) | Отказ доступа (несовпадение групп) |
www-data | www-data:www-data (0660) | Успешное соединение (OK) |
- Служба
php-fpm.serviceработает, сокет-файл физически существует на диске. - При смене прав на
chmod 777 /var/run/php/php-fpm.sockпроблема исчезает, но возвращается после рестарта PHP-FPM.
- Проверьте текущие права и владельца сокет-файла:
ls -la /var/run/php/php*-fpm.sock # Или /run/php-fpm/www.sock - Определите системного пользователя, под которым работает воркер Nginx:
ps aux | grep nginx | grep worker - Отредактируйте пул конфигурации PHP-FPM (обычно
/etc/php/8.x/fpm/pool.d/www.confили/etc/php-fpm.d/www.conf):sudo nano /etc/php/8.2/fpm/pool.d/www.conf # Раскомментируйте и установите правильного пользователя и группу: listen.owner = www-data listen.group = www-data listen.mode = 0660 - Если пользователи веб-сервера и PHP отличаются (например,
nginxиphp-fpm), добавьте пользователя Nginx в группу PHP-FPM:sudo usermod -aG php-fpm nginx # Или настройте POSIX ACL на директорию сокетов: sudo setfacl -m u:nginx:rw /var/run/php/php-fpm.sock - Перезапустите службы PHP-FPM и Nginx:
sudo systemctl restart php8.2-fpm sudo systemctl restart nginx
listen.mode = 0777 в production-средах, так как это нарушает изоляцию процессов и позволяет любому локальному пользователю системы перехватывать входящий веб-трафик.Частые вопросы (FAQ)
Почему права на сокет сбрасываются после перезапуска PHP-FPM?
При каждом перезапуске демон PHP-FPM пересоздает файл сокета заново, применяя права и владельца, жестко прописанные в директивах listen.owner, listen.group и listen.mode в файле www.conf.
Что быстрее: UNIX-сокет или TCP-порт (127.0.0.1:9000)?
UNIX-сокеты работают быстрее на 15-25% за счет отсутствия оверхеда на сетевой стек TCP/IP, вычисление контрольных сумм и буферизацию пакетов внутри ядра.
Как проверить синтаксис конфига PHP-FPM без перезапуска?
Выполните команду php-fpm8.2 -t (укажите вашу версию PHP).
Влияет ли SELinux на доступ к UNIX-сокетам?
Да, если сокет создан в нетипичном каталоге (/tmp вместо /run/php-fpm), SELinux заблокирует вызов connect().