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
注意事项
每个池都应该使用不同的套接字。如果您有多个池使用同一个套接字,则会出现问题。
指令 user
和 group
控制该池的 FPM 进程将运行的用户/组。这些不指定套接字的用户/组。
指令listen.owner
和listen.group
控制套接字用于该池的用户/组。
池指令(如listen.*
)仅适用于池。所以你不能在全局部分使用它们,你必须为每个池指定它们。
套接字权限
当listen.owner
和listen.group
与网络服务器相同时,权限0660 完全没问题。您甚至可以使用 0600,但有人可能会争辩说,任何可以在与 web 服务器相同的组下操作的用户也可以使用套接字,所以我会使用 0660。
【讨论】:
谢谢,但是添加包含没有效果...我想全局声明listen.parameters,所以我不必将它们添加到每个套接字配置中... 我不确定你在这里说的是什么“效果”。无论如何,我已经编辑了我的答案,以便更清楚地了解在为每个池使用不同文件时应如何配置 FPM。 可能还值得注意的是,如果您设置“listen.acl_users”,它将导致listen.owner 和listen.group 被忽略。因此,如果您无法弄清楚为什么它没有使用您的所有者和组,请同时检查 acl_users。【参考方案2】:只需在此处添加listen.acl_users
指令应该被注释,否则,它将覆盖listen.owner
和listen.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配置 错误connect() failed (111: Connection refused) while connecting to upstream connect()