nginx和php-fpm套接字所有者

Fez*_*sta 16 php centos nginx

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

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

这个问题是由于使用的php-fpm套接字的权限不好引起的,实际上我认为这/var/run/php-fcgi.sock是由root:rootnginx和php-fpm用作用户所拥有的www-data.

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

listen.owner = www-data
listen.group = www-data
listen.mode = 0660
Run Code Online (Sandbox Code Playgroud)

但它没有解决问题,当我重新启动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
Run Code Online (Sandbox Code Playgroud)

如果我在每个条目中添加这些字符串:

listen.owner = www-data
listen.group = www-data
listen.mode = 0666
Run Code Online (Sandbox Code Playgroud)

一切正常.

所以看起来不包括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
Run Code Online (Sandbox Code Playgroud)

Jas*_*wer 27

配置文件FPM将读取

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

您可以通过将行include=/etc/php-fpm.d/*.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
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

示例/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
Run Code Online (Sandbox Code Playgroud)

指令要注意

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

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

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

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

套接字权限

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


小智 7

只需在此处添加该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
Run Code Online (Sandbox Code Playgroud)


Ant*_*ris 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
Run Code Online (Sandbox Code Playgroud)

  • 我认为现在它已更改为“apache”,“www-data”在 Debian 中,但作者说的是 CentOS。 (2认同)