更新系统后,我遇到了在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
答案 0 :(得分:24)
/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。
答案 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.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