nginx错误连接到php5-fpm.sock失败(13:权限被拒绝)

我更新nginx到1.4.7和PHP到5.5.12 ,之后,我得到了502错误 。 在我更新之前一切工作正常。

nginx的-error.log中

2014/05/03 13:27:41 [crit] 4202#0: *1 connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied) while connecting to upstream, client: xx.xxx.xx.xx, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "xx.xx.xx.xx" 

nginx.conf

 user www www; worker_processes 1; location / { root /usr/home/user/public_html; index index.php index.html index.htm; } location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/home/user/public_html$fastcgi_script_name; include fastcgi_params; } 

我更新后有一个类似的错误。 PHP修复了一个安全漏洞 ,其中对套接字文件具有权限。

  1. 打开/etc/php5/fpm/pool.d/www.conf/etc/php/7.0/fpm/pool.d/www.conf ,具体取决于您的版本。
  2. 取消注释所有权限行,如:

     listen.owner = www-data listen.group = www-data listen.mode = 0660 
  3. 重启fpm – sudo service php5-fpm restart或者sudo service php7.0-fpm restart

注意 :如果您的Web服务器以www-data以外的用户身份运行,则需要相应地更新www.conf文件

目前提到的所有修补程序基本上都是重新启用安全漏洞。

我最终做的是将以下几行添加到我的PHP-FPMconfiguration文件中。

 listen.owner = www-data listen.group = www-data 

确保www-data实际上是nginx工作者正在运行的用户。 对于debian来说,它是默认的www数据。

这样做并不能解决这个变化本应解决的安全问题 。

@ Xander的解决scheme工作,但重新启动后不会持续。

我发现我必须在/etc/php5/fpm/pool.d/www.conf listen.mode更改为0660

来自www.conf的示例:

 ; 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. Many ; BSD-derived systems allow connections regardless of permissions. ; 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 

编辑:每@Chris Burgess,我已经改变了这个更安全的方法。

我删除了listen.mode,.group和.owner的注释:

 listen.owner = www-data listen.group = www-data listen.mode = 0660 

/ var / run只保存上次启动后正在运行的系统信息,例如当前login的用户和运行的守护进程。 ( http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard#Directory_structure )。

边注:

我的php5-fpm -v报告: PHP 5.4.28-1+deb.sury.org~precise+1 。 这个问题也是在最近更新之后才发生的。

如果你已经尝试了这篇文章中的所有内容,但是没有成功让PHP工作,这是为我的情况修复的:

确保你在/etc/php5/fpm/pool.d/www.conf中没有注释这些行:

 listen.owner = www-data listen.group = www-data listen.mode = 0660 

确保/ etc / nginx / fastcgi_params如下所示:

 fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200; 

这两行在我的/ etc / nginx / fastcgi_params中不存在,请确保它们在那里!

 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; 

然后,重新启动php5-fpm和nginx。 应该做的伎俩。

实际上,“listen.mode”应该是:“0660”而不是“0666”,因为“其他可写”或“其他可读”在这里永远不是一个好的select。

所以试着找出你的networking服务器运行的用户/组。 我使用CentOs,并以“nginx”用户身份运行。所以添加到你的php-fpm.conf中:

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

最后重启php-fpm

检查哪个用户运行nginx。 从Ubuntu 12.04开始,nginx运行于不是www-data组成员的nginx用户。

usermod -a -G www-data nginx

并重新启动nginx和php5-fpm守护进程解决了这个问题。

在你的PHPconfiguration中扩展权限的替代方法,你可以改变在你的nginxconfiguration中指定的用户。

在上面的nginx.conf摘录的第一行中,用户和组分别被指定为www和www。

 user www www; 

同时,你的PHPconfiguration可能指定一个用户和www-data组:

 listen.owner = www-data listen.group = www-data 

您可能会将nginx.conf中的行更改为以下任一行:

 user www-data www; user www-data www-data; # or any group, really, since you have the user matching user www www-data; # requires that your php listen.mode gives rw access to the group 

如果有的话,还必须考虑您的个人FPM池。

我无法弄清为什么这些答案今天没有为我工作。 对于我来说,这已经是一种“一劳永逸”的情景,我忘记了listen.user和listen.group是基于每个池的重复。

如果您像我一样为不同的用户帐户使用池,其中每个用户帐户都拥有其FPM进程和套接字,那么只将缺省的listen.owner和listen.groupconfiguration选项设置为“nginx”将不起作用。 显然,让'nginx'拥有它们都是不可接受的。

对于每个池 ,确保

 listen.group = nginx 

否则,你可以离开游泳池的所有权等。

我今天刚刚得到这个错误,因为我更新了我的机器(更新PHP)运行Ubuntu 14.04 。 分发configuration文件/etc/php5/fpm/pool.d/www.conf是好的,当前不需要任何更改。

我发现了以下错误:

 dmesg | grep php [...] [ 4996.801789] traps: php5-fpm[23231] general protection ip:6c60d1 sp:7fff3f8c68f0 error:0 in php5-fpm[400000+800000] [ 6788.335355] traps: php5-fpm[9069] general protection ip:6c5d81 sp:7fff98dd9a00 error:0 in php5-fpm[400000+7ff000] 

奇怪的是,我有两个网站运行,利用这台机器上的PHP-FPM一个运行良好,另一个(一个微小的RSS安装)给了我一个502, 两者 之前运行良好。

我比较了两个configuration文件,发现fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 失踪的受影响的网站。

现在这两个configuration文件都包含下面的块,并且再次正常运行:

 location ~ \.php$ { fastcgi_pass unix:/var/run/php5-fpm.sock; include /etc/nginx/snippets/fastcgi-php.conf; } 

更新

需要注意的是,Ubuntu提供了两个与fastcgi相关的参数文件,同时还有一个configuration片段,这个片段在Vivid之后也可以在PPA版本中使用。 该解决scheme已相应更新。

fastcgi参数文件的差异:

 $ diff -up fastcgi_params fastcgi.conf --- fastcgi_params 2015-07-22 01:42:39.000000000 +0200 +++ fastcgi.conf 2015-07-22 01:42:39.000000000 +0200 @@ -1,4 +1,5 @@ +fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; 

/etc/nginx/snippets/fastcgi-php.confconfiguration片段

 # regex to split $uri to $fastcgi_script_name and $fastcgi_path fastcgi_split_path_info ^(.+\.php)(/.+)$; # Check that the PHP script exists before passing it try_files $fastcgi_script_name =404; # Bypass the fact that try_files resets $fastcgi_path_info # see: http://trac.nginx.org/nginx/ticket/321 set $path_info $fastcgi_path_info; fastcgi_param PATH_INFO $path_info; fastcgi_index index.php; include fastcgi.conf; 

以下简单的修复工作对我来说,绕过套接字的可能的权限问题。

在你的nginxconfiguration中,将fastcgi_pass设置为:

 fastcgi_pass 127.0.0.1:9000; 

代替

 fastcgi_pass /var/run/php5-fpm.sock; 

这必须与/etc/php5/fpm/pool.d/www.conf中的listen =参数相匹配,所以也要将其设置为:

 listen = 127.0.0.1:9000; 

然后重新启动php5-fpm和nginx

 service php5-fpm restart 

 service nginx restart 

欲了解更多信息,请参阅: https : //wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm/

从Ubuntu 14.04 lts升级到Ubuntu 16.04 lts之后,我发现了另一个我以前没见过的错误的原因。

在升级过程中,我不知何故完全失去了我的php5-fpm可执行文件。 所有的configuration文件完好无损,我花了一段时间才意识到, service php5-fpm start并没有真正开始一个进程,因为它没有显示任何错误。

我的觉醒时刻是当我注意到在/var/run/php5-fpm.sock中没有socket文件,因为应该有,也没有netstat -an显示进程侦听端口,我试图作为替代尝试解决这个问题。 由于/ usr / sbin / php5-fpm文件也不存在,我终于走上了正轨。

为了解决这个问题,我升级了PHP从5.5版到7.0。 apt-get install php-fpm做了一个副作用的伎俩。 之后,安装其他必要的软件包,一切恢复正常。


然而,这种升级解决scheme可能有其自身的问题 。 由于PHP已经发展了很多,所以软件可能会以难以想象的方式打破。 所以,即使我沿着这条路走下去了,你可能会希望只保留一段你喜欢的版本。

幸运的是, 似乎有一个很好的方法 ,如“自定义Windows站点”中所述:

 add-apt-repository ppa:ondrej/php apt-get purge php5-common apt-get update apt-get install php5.6 

因为它可能是整洁的解决scheme,我没有尝试。 我预计接下来的几天会告诉我是否应该有。

问题是我的情况是,Nginx的networking服务器是以用户nginx的身份运行的,池是以用户www-data的forms运行的。

我通过更改用户Nginx运行在/etc/nginx/nginx.conf文件(可能与您的系统不同,我的是Ubuntu 16.04.1)解决了这个问题。

更改: user nginx;

到: user www-data;

然后重新启动Nginx: service nginx restart

简单,但工作..

 listen.owner = nginx listen.group = nginx chown nginx:nginx /var/run/php-fpm/php-fpm.sock 

我已经通过以下步骤修复了Amazon Linux AMI 2016.09(Centos 7)上的相同问题。

打开你的http://www.conf文件(例如:sudo nano /etc/php-fpm.d/www.conf)最后,find设置listen.owner和listen.group的行,并将它们的值从“nobody”更改为“nginx “:

 listen.owner = nginx listen.group = nginx listen.mode = 0666 

最后,find设置用户和组的行,并将其值从“apache”更改为“nginx”:

 user = nginx group = nginx 

重新启动php-fpm(sudo服务php-fpm restart)

只要在CentOS(可能是Red Hat和Fedora)上添加更改权限的文件即可:

/etc/php-fpm.d/www.conf

为了获得最舒适的系统,我在服务器上改变了操作系统。

它大多数时间工作得很好,但最后我得到了这个502网关错误。

我为每个帐户使用一个php fpm套接字,而不是保持相同的一个。 所以,如果一个崩溃,至less其他应用程序继续运行。

我曾经有用户和组www数据。 但是这个在最新的Nginx 1.8和php5-fpm的Debian 8上改变了。

默认用户是nginx,组也是。 为了确保这一点,最好的方法是检查/ etc / group和/ etc / passwd文件。 这些不能说谎。

在那里,我发现现在我有nginx在两个,不再www数据。

也许这可以帮助一些人仍然试图找出为什么错误消息不断出现。

它为我工作。

如果每个用户拥有不同的池,请确保在configuration文件中正确设置了用户和组。 你可以在/etc/nginx/nginx.conf文件中findnginx用户。 nginx组与nginx用户相同。

 user = [pool-user] group = [pool-group] listen.owner = [nginx-user] listen.group = [nginx-group] 

对于那些试图在这个线程中的一切,仍然卡住:这解决了我的问题。 我更新了/usr/local/nginx/conf/nginx.conf

  1. 取消注释说user的行

  2. 使它的www-data所以它变成: user www-data;

  3. 保存(需要root权限)

  4. 重新启动nginx

如果你有声明

pid = /run/php-fpm.pid

listen = /run/php-fpm.pid

在不同的configuration文件中,那么root将会拥有这个文件。