nginx 和 php-fpm 套接字所有者

2022-08-30 17:01:38

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

1 连接到 unix:/var/run/php-fcgi-vhostname-php-fcgi-0.sock 失败 (13: 权限被拒绝) 在连接到上游时, 客户端: xx.xxx.xx.xx, 服务器: localhost, 请求: “GET / HTTP/1.1”, 上游: “fastcgi://unix:/var/run/php-fcgi-vhostname-php-fcgi-0.sock:”, 主机: “xx.xx.xx.xx”

这个问题是由使用的php-fpm套接字的权限错误引起的,实际上我看到由nginx和php-fpm拥有作为用户使用。/var/run/php-fcgi.sockroot:rootwww-data

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

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。它为每个网站/ 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

答案 1

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

注意事项

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

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

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

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

套接字权限

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


答案 2

只需在此处添加指令应注释,否则,它将覆盖 and 值:listen.acl_userslisten.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

推荐