在我的系统更新后,我遇到了在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:root
nginx和php-fpm用作用户所拥有的www-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.它为每个网站/虚拟主机创建一个新的套接字,并设置它们/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
Jasper N. Br.. 27
/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
/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.*
)仅适用于池.因此,您不能在全局部分中使用它们,您必须为每个池指定它们.
权限0660完全没问题,listen.owner
并且listen.group
与网络服务器相同.您甚至可以使用0600,但有人可能会争辩说,任何可以在与Web服务器相同的组下运行的用户也可以使用套接字,所以我会使用0660.
/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
/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.*
)仅适用于池.因此,您不能在全局部分中使用它们,您必须为每个池指定它们.
权限0660完全没问题,listen.owner
并且listen.group
与网络服务器相同.您甚至可以使用0600,但有人可能会争辩说,任何可以在与Web服务器相同的组下运行的用户也可以使用套接字,所以我会使用0660.
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