nginx和php-fpm套接字所有者

时间:2014-06-20 10:57:10

标签: php nginx centos

更新系统后,我遇到了在Nginx上运行的PHP应用程序的错误网关错误。

  

1连接()到unix:/var/run/php-fcgi-vhostname-php-fcgi-0.sock连接上游时失败(13:权限被拒绝),客户端:xx.xxx.xx.xx, server:localhost,request:" GET / HTTP / 1.1",upstream:" fastcgi:// unix:/var/run/php-fcgi-vhostname-php-fcgi-0.sock :",主持人:" xx.xx.xx.xx"

问题是由于使用的php-fpm套接字的权限不好引起的,实际上我看到/var/run/php-fcgi.sock拥有root:root但是nginx和php-fpm用作用户www-data。< / p>

我已经在/etc/php-fpm.d/www.conf编辑了php-fpm配置:

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

但它没有解决问题,当我重新启动nginx和php-fpm时,套接字是以root:root为用户/组创建的。

我发现修复它的唯一方法是将套接字的所有者手动更改为www-data:www-data。但这不是一个真正的解决方案,因为每次重新启动我的服务时我都会再次应用它。

如何解决此问题?我在CentOS 6.5上

编辑:

我使用Ajenti-V配置我的虚拟主机和我的PHP-FPM。它为每个网站/虚拟主机创建一个新套接字,并在/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

7 个答案:

答案 0 :(得分:24)

配置文件FPM将读取

/etc/php-fpm.conf是FPM将读取的配置文件(在CentOS上)。如果您希望FPM也读取其他配置文件,您需要告诉它。

您可以将include=/etc/php-fpm.d/*.conf行放在/etc/php-fpm.conf的底部。然后它将读取目录/etc/php-fpm.d中的所有内容(以.conf结尾)。

然后将全局指令和包含行放在/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

指令要注意

  • 每个池应使用不同的套接字。如果您有多个使用相同套接字的池,则会遇到问题。

  • 指令usergroup控制该池的FPM进程将作为其运行的用户/组。这些指定套接字的用户/组。

  • 指令listen.ownerlisten.group控制套接字用于该池的用户/组。

  • 池指令(如listen.*)仅适用于池。因此,您无法在全局部分中使用它们,您必须为每个池指定它们。

套接字权限

listen.ownerlisten.group与网络服务器相同时,权限0660完全正常。您甚至可以使用0600,但有人可能会争辩说,任何可以在与Web服务器相同的组下运行的用户也可以使用套接字,所以我会使用0660。

答案 1 :(得分:6)

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

答案 2 :(得分:1)

大家好! 这也是我的问题。 我刚刚将我的fpm用户改为流浪汉,重启我的游泳池......完成了! 这是我的conf:

user = vagrant
group = nginx

listen.owner = vagrant
listen.group = nginx
listen.mode = 0660

希望它可以帮助别人。

答案 3 :(得分:1)

在安装Centos 7.5,Apache php 7.1和php 5.6的过程中,我遇到了同样的问题,必须手动修复 php56-php.fpm.sock (由root拥有)上的权限)。每次重新启动后。

我的php56配置在这里,安装时可能有所不同: /opt/remi/php56/root/etc/php-fpm.d/www.conf

我更改了文件中的此注释部分:

listen.owner = nginx
listen.group = nginx
listen.mode = 0666

现在,重新启动后,在套接字文件上具有正确的权限就可以了。不确定listen.mode。我认为 0660 也可以。

答案 4 :(得分:0)

大家好,感谢您的帮助,在我的情况下使用Ubuntu服务器14.04 nginx和php5-fpm通过编辑文件来解决文件/etc/php5/fpm/pool.d/www解决了php-fpm套接字所有者的问题.conf文件 取消注释:

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

从明确的安装中,nginx所有者和组是www-data。 我认为最好的做法是查看/etc/nginx/nginx.conf并验证第一行是:

user www-data;

使用默认用户Chears!

答案 5 :(得分:0)

做其他事情

我的配置 Vagrant / Ubuntu 16 / Nginx 1.13 / PHP-FPM 7.1

sudo vi /etc/nginx/nginx.conf

更改第一行用户nginx =&gt;用户www-data

service nginx restart

答案 6 :(得分:0)

仅在此处添加listen.acl_users指令应加注释,否则它将覆盖listen.ownerlisten.group值:

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
;                 mode is set to 0660
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

; When POSIX Access Control Lists are supported you can set them using
; these options, value is a comma separated list of user/group names.
; When set, listen.owner and listen.group are ignored
;listen.acl_users = apache,nginx