nginx 和 php-fpm 套接字所有者

Posted

技术标签:

【中文标题】nginx 和 php-fpm 套接字所有者【英文标题】:nginx and php-fpm socket owner 【发布时间】:2014-08-11 02:50:52 【问题描述】:

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

1 connect() to 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套接字的错误权限引起的,实际上我看到root:root拥有的/var/run/php-fcgi.sock但是nginx和php-fpm使用用户www-data

我已经在/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

【问题讨论】:

我已撤回我的答案,因为它不正确。就我而言,0666 是解决方案,因为 nginx 和 php-fpm 中有不同的组。但我也检查了我的安装(CentOS 6.5 也是),我没有看到这个问题...PHP 5.4.28 (cli) (built: May 2 2014 19:09:57) 我刚刚更新了我的 php 版本,同样 - 没有这样的问题。 PHP 5.4.29 (cli) (built: Jun 5 2014 16:07:48)。我能想象的最后一件事是 www.conf 出于某种原因未在您的情况下使用。 是的,我认为它忽略了这些设置......但我不知道如何修复它。 嗯,尝试使用池设置。 Nginx Bad Gateway 表示它找不到 php 或 php-fpm 正忙。 请提供错误日志在 NGINX。 我已经添加了错误日志,顺便说一句,这正是我已经解释过的...... 【参考方案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

注意事项

每个池都应该使用不同的套接字。如果您有多个池使用同一个套接字,则会出现问题。

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

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

池指令(如listen.*)仅适用于池。所以你不能在全局部分使用它们,你必须为每个池指定它们。

套接字权限

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

【讨论】:

谢谢,但是添加包含没有效果...我想全局声明listen.parameters,所以我不必将它们添加到每个套接字配置中... 我不确定你在这里说的是什么“效果”。无论如何,我已经编辑了我的答案,以便更清楚地了解在为每个池使用不同文件时应如何配置 FPM。 可能还值得注意的是,如果您设置“listen.acl_users”,它将导致listen.owner 和listen.group 被忽略。因此,如果您无法弄清楚为什么它没有使用您的所有者和组,请同时检查 acl_users。【参考方案2】:

只需在此处添加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

【讨论】:

最佳答案!【参考方案3】:

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

【讨论】:

我认为现在它已更改为“apache”,“www-data”在 Debian 中,但作者说的是 CentOS。【参考方案4】:

大家! 这也是我的问题。 我刚刚将我的 fpm 用户更改为 vagrant,重新启动我的池,然后......完成了! 我的conf来了:

user = vagrant
group = nginx

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

希望它可以帮助某人。

【讨论】:

是的,这是使用 Vagrant 的关键【参考方案5】:

在我的安装中,Centos 7.5、带有 php 7.1 和 php 5.6 的 Apache 我遇到了同样的问题,我必须手动修复 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 也可以。

【讨论】:

你也可以使用listen.acl_users=nginx(而且listen.mode=0666不利于安全) 感谢@RemiCollet 的建议!【参考方案6】:

大家好,感谢您的帮助,在我的情况下,Ubuntu 服务器 14.04 nginx 和 php5-fpm 通过编辑文件 /etc/php5/fpm/pool.d/www 解决了 root 的 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 !

【讨论】:

【参考方案7】:

做别的就行了

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

sudo vi /etc/nginx/nginx.conf

更改第一行用户 nginx => 用户 www-data

service nginx restart

【讨论】:

以上是关于nginx 和 php-fpm 套接字所有者的主要内容,如果未能解决你的问题,请参考以下文章

高流量站点NGINX与PHP-fpm配置优化

高流量站点NGINX与PHP-fpm配置优化

Nginx+PHP-FPM的域Socket(套接字)配置

nginx和php-fpm配置 错误connect() failed (111: Connection refused) while connecting to upstream connect()

php-fpm监听socket类型-解决Connection refused

通过 Unix 套接字和 TCP/IP 套接字运行 PHP-FPM 有啥区别?