После обновления моей системы я столкнулся с плохой ошибкой шлюза моих приложений PHP, работающих на Nginx.
*1 connect() to unix:/var/run/php-fcgi-vhostname-php-fcgi-0.sock failed (13: Permission denied) while connecting to upstream, client: xx.xxx.xx.xx, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fcgi-vhostname-php-fcgi-0.sock:", host: "xx.xx.xx.xx"
Проблема вызвана плохими разрешениями сокетов php-fpm, на самом деле я вижу /var/run/php-fcgi.sock
принадлежащие root:root
но nginx и php-fpm используют в качестве пользовательских www-data
.
Я уже редактировал конфигурацию php- /etc/php-fpm.d/www.conf
на /etc/php-fpm.d/www.conf
с помощью:
listen.owner = www-data listen.group = www-data listen.mode = 0660
но это не решает проблему, и когда я перезапускаю nginx и php-fpm, сокеты создаются с помощью root:root
как user / group.
Единственное, что я нашел, чтобы исправить это, – это изменить владельца сокетов на www-data: www-data вручную. Но это не настоящее решение, потому что каждый раз, когда я перезапускаю свои службы, я должен снова применить его.
Как я могу исправить эту проблему? Я на CentOS 6.5
Я использую Ajenti-V для настройки моих vhosts и моего PHP-FPM. Он создает новый сокет для каждого веб-сайта / vhost, и они устанавливаются в /etc/php-fpm.conf
Они имеют такую структуру:
[vhostname-php-fcgi-0] user = www-data group = www-data listen = /var/run/php-fcgi-vhostname-php-fcgi-0.sock pm = dynamic pm.max_children = 5 pm.start_servers = 1 pm.min_spare_servers = 1 pm.max_spare_servers = 5
Если я добавлю к каждой записи эти строки:
listen.owner = www-data listen.group = www-data listen.mode = 0666
Все работает правильно.
Так выглядит как www.conf не входит (может быть?). Это мой php-fpm.conf:
[global] pid = /var/run/php-fpm/php-fpm.pid error_log = /var/log/php5-fpm.log [global-pool] user = www-data group = www-data listen = /var/run/php-fcgi.sock pm = dynamic pm.start_servers = 1 pm.max_children = 5 pm.min_spare_servers = 1 pm.max_spare_servers = 5 [vhostname-php-fcgi-0] user = www-data group = www-data listen = /var/run/php-fcgi-vhostname-php-fcgi-0.sock pm = dynamic pm.max_children = 5 pm.start_servers = 1 pm.min_spare_servers = 1 pm.max_spare_servers = 5
/etc/php-fpm.conf
– это файл конфигурации, который будет читать FPM (на CentOS). Если вы хотите, чтобы FPM также читал другие файлы конфигурации, вам нужно сказать об этом.
Вы можете сделать это, поставив строку include=/etc/php-fpm.d/*.conf
/etc/php-fpm.conf
в нижней части /etc/php-fpm.conf
. Затем он будет читать все в каталоге /etc/php-fpm.d
(который заканчивается на .conf
).
Затем поместите глобальные директивы и строку include в /etc/php-fpm.conf
. Это может выглядеть примерно так:
[global] pid = /var/run/php-fpm/php-fpm.pid error_log = /var/log/php5-fpm.log include=/etc/php-fpm.d/*.conf
И иметь отдельный файл в /etc/php-fpm.d
для каждого пула.
Пример /etc/php-fpm.d/global.conf
:
[global-pool] user = www-data group = www-data listen = /var/run/php-fcgi.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 pm = dynamic pm.start_servers = 1 pm.max_children = 5 pm.min_spare_servers = 1 pm.max_spare_servers = 5
Пример /etc/php-fpm.d/vhostname-0.conf
:
[vhostname-php-fcgi-0] user = www-data group = www-data listen = /var/run/php-fcgi-vhostname-php-fcgi-0.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 pm = dynamic pm.max_children = 5 pm.start_servers = 1 pm.min_spare_servers = 1 pm.max_spare_servers = 5
Каждый пул должен использовать другой сокет. Если у вас несколько пулов, использующих один и тот же сокет, вы получите проблемы.
Директивы user
и group
управляют пользователем / группой, для которой будет выполняться процесс FPM для этого пула. Они не указывают пользователя / группу сокета.
Директивы listen.owner
и listen.group
управляют пользователем / группой, которую использует сокет для этого пула.
Директивы пула (например, listen.*
) Будут работать только для пулов. Поэтому вы не можете использовать их в глобальной секции, вы должны указать их для каждого пула.
Разрешения 0660 отлично listen.owner
если listen.owner
и listen.group
совпадают с веб- listen.group
. Вы даже можете использовать 0600, но можно утверждать, что любой пользователь, который может работать в той же группе, что и веб-сервер, также может использовать сокет, поэтому я бы использовал 0660.
NGINX работает как пользователь nginx
и php5-fpm в качестве пользовательских www-data
. Просто добавьте nginx
для группировки www-data
и проблема решена, и nginx может получить доступ к /var/run/php5-fpm.sock
. Отлично работает с Ubuntu 14.04, nginx 1.7.10, PHP 5.5.9-1ubuntu4.6 (fpm-fcgi):
$ sudo usermod -aG www-data nginx
все! Это тоже моя проблема. Я просто изменил мой fpm-пользователь на бродягу, перезапустил мои пулы и … все сделано! Вот мой конфиг:
user = vagrant group = nginx listen.owner = vagrant listen.group = nginx listen.mode = 0660
Надеюсь, это может помочь кому-то.
Привет всем и спасибо за помощь, в моем случае с сервером Ubuntu 14.04 nginx и php5-fpm проблема с владельцем сокета php-fpm от root была решена путем редактирования файла /etc/php5/fpm/pool.d/www.conf Uncomment линии:
listen.owner = www-data listen.group = www-data listen.mode = 0660
Из чистой установки владелец и группа nginx являются www-данными. Я думаю, что лучше всего посмотреть /etc/nginx/nginx.conf и убедиться, что в первой строке:
user www-data;
И используйте пользователя по умолчанию, Chears!
Просто сделайте это еще что-нибудь
My Config Vagrant / Ubuntu 16 / Nginx 1.13 / PHP-FPM 7.1
sudo vi /etc/nginx/nginx.conf
Изменить пользователя первой строки nginx => user www-data
service nginx restart