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


290

我将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;
        }

3
此错误报告解释了为什么发生这种情况:bugs.php.net/bug.php?id=67060
Matt Cooper

1
从ubuntu 14升级到16的所有人都需要将袜子更改为unix:/var/run/php/php7.0-fpm.sock
Karussell

Answers:


626

php更新后出现类似错误。PHP固定一个安全漏洞,其中orw权限的套接字文件。

  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 restartsudo service php7.0-fpm restart

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


11
鉴于这使套接字绝对对所有人都适用,我不禁认为这是一个可怕的解决方案。
沙杜尔2014年

11
这种方法可恢复在bugs.php.net/bug.php?id=67060中解决的不安全默认配置-可以考虑考虑artooro建议的listen.owner修复。
克里斯·伯吉斯

2
非常混乱。为什么不编辑您的答案是正确的,(转到/ etc ...),然后评论一下如何存在一种不太安全的方法,该方法仅在重新启动后才起作用(转到/ var / ..)。
SamGoody 2014年

1
@Tecnocat为什么不那么安全?我认为他们是一样的。www-data和660。所以,我不明白怎么了?
Xander 2014年

13
sudo usermod -aG www-data nginx允许nginx访问文件
AnthumChris

107

此处当前提到的所有修复程序基本上都重新启用了安全漏洞。

我最终要做的是将以下行添加到我的PHP-FPM配置文件中。

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

确保www-data实际上是nginx worker运行的用户。对于debian,默认情况下为www-data。

以这种方式进行操作不会解决应该解决安全问题


16
要检查nginx用户名ps aux|grep nginx
SamGoody 2014年

2
在Ubuntu上的/etc/php5/fpm/php.ini
Reality Extractor,

1
@RealityExtractor我不这么认为。该文件仅包含常规PHP设置,与FPM流程管理器无关。
Martijn Heemels,2014年

4
对我来说,我还必须手动删除/var/run/php5-fpm.sock它,因为它已经由创建www-data。只是单挑...
Giel Berkers 2014年

1
从安全角度考虑,这是正确的解决方案。
jschorr 2014年

45

@Xander的解决方案有效,但在重新启动后不会持续存在。

我发现,我不得不改变listen.mode,以0660/etc/php5/fpm/pool.d/www.conf

来自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仅保存有关自上次引导以来正在运行的系统的信息,例如当前登录的用户和正在运行的守护程序。(http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard#Directory_structure)。

边注:

我的php5-fpm -v报告:PHP 5.4.28-1+deb.sury.org~precise+1。最近更新之后也确实发生了此问题。


5
这种方法可恢复在bugs.php.net/bug.php?id=67060中解决的不安全默认配置-可以考虑考虑artooro建议的listen.owner修复。
克里斯·伯吉斯

如果listen.acl_groups被设置,listen.owner并且listen.group被忽略。我设置listen.acl_groups =,然后502 /权限问题就消失了。在取消注释上述listen.行后找到它,502问题仍然存在并systemctl status php-fpm显示警告WARNING: [pool www] ACL set, listen.owner = 'nobody' is ignored
idoimaging '18

37

如果您已尝试了本文中的所有内容,但没有成功使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。应该做到的。


2
非常感谢!我失去了所有的希望,这挽救了我的屁股。
Diego Castro 2014年

1
你是我的英雄,你拯救了这一天!
jeppeb 2015年

1
没有什么词可以形容我多么感激!更新软件包后,一切都进行了计算,从而节省了一天的时间。
NikolaProkopić16年

我想给你一个以上的
答案

28

实际上,“ listen.mode”应为:“ 0660”而不是“ 0666”,因为“其他可写”或“其他可读”在这里从来都不是一个好选择。

因此,尝试找出您的网络服务器以哪个用户/组运行。我使用CentO,它以“ nginx”用户身份运行,因此添加到您的php-fpm.conf中:

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

终于重新启动php-fpm


值得的是,在我的Ubuntu 12.04系统上,用户和组为www-data
布拉德(Brad)

1
对我而言,在CentOS中,它可以将用户设置为“ nobody”,将组设置为“ nginx”。可能不是一个重大改进,但我希望提供尽可能有限的权限。
卡扎伊

23

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

usermod -a -G www-data nginx

然后重新启动nginx和php5-fpm守护程序即可解决此问题。


此修复程序似乎是最干净,安全的方法。使用Ubuntu 14.04,Nginx 1.7.10,PHP 5.5.9-1ubuntu4.6(fpm-fcgi)
AnthumChris 2015年

12

除了扩展php配置中的权限之外,您还可以更改nginx配置中指定的用户。

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

user  www www;

同时,您的php配置可能指定了www数据的用户和组:

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

非常感谢你!
Aline Matos 2014年

非常感谢你!更改nginx.conf是必要的。
LCB

7

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

我不知道为什么这些答案今天对我都不起作用。对于我来说,这是一个“一劳永逸”的场景,在这里我忘记了在每个池中重复执行listen.user和listen.group。

如果像我一样将池用于不同的用户帐户,其中每个用户帐户都拥有其FPM进程和套接字,则仅将默认的listen.owner和listen.group配置选项设置为“ nginx”将完全不起作用。显然,让“ nginx”全部拥有也是不可接受的。

对于每个池,请确保

listen.group = nginx

否则,您可以单独保留池的所有权。


谢谢。如果Ngnix适用于不同的用户帐户,则应像这样“ listen.group = nginx”进行更改
MURATSPLAT 2014年

6

今天,当我更新运行Ubuntu 14.04的机器(带有PHP的更新)时,才再次遇到此错误。发行配置文件/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]

奇怪的是,我有运行2个站点利用这个机器一个PHP-FPM运行良好,而其他(个小小RSS安装)给了我502,其中两个已经运行良好之前

我比较了两个配置文件,发现fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;受影响的站点缺少该文件。

现在,两个配置文件都包含以下块,并且可以再次正常运行:

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

更新资料

应该注意的是,Ubuntu附带了两个与fastcgi相关的参数文件,以及一个自Vivid和PPA版本开始可用的配置代码段。解决方案已相应更新。

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.conf

# 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;

3
非常感谢。我也有同样的问题。奇怪的是,包装中没有包括这一行。我只是将其添加到/ etc / nginx / fastcgi_params中,并且所有内容现在都可以再次使用。
Bukashk0zzz 2014年

5

以下简单修复对我有效,绕过了套接字可能出现的权限问题。

在您的nginx配置中,将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/


尽管这可能会不断发生,但它不是解决袜子问题的解决方案。
克里斯,

5

我的问题是Nginx Web服务器以用户nginx的身份运行,而池以用户www-data的身份运行。

我通过更改/etc/nginx/nginx.conf文件中运行用户Nginx的方式解决了该问题(系统上可能有所不同,我的系统是Ubuntu 16.04.1)

更改: user nginx;

至: user www-data;

然后重启Nginx: service nginx restart


4

简单但有效

listen.owner = nginx
listen.group = nginx

chown nginx:nginx /var/run/php-fpm/php-fpm.sock

据我了解,重新启动将无法生存,因此更多是临时修复。
克里斯,

4

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

打开您的www.conf文件(示例:sudo nano /etc/php-fpm.d/www.conf)最后,找到设置listen.owner和listen.group的行,并将其值从“ nobody”更改为“ nginx” “:

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

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

user = nginx
group = nginx

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


2
使用660代替666 666是不安全的,并通过该补丁固定bugs.php.net/...
Xander的

3

这里最重要的是,该用户正在使用nginx,那么是否还需要指定它

在您的nginx.conf中

user www-data;
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;
        }

在您的www.conf中

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

在您的情况下,用户和组是“ www”,因此只需将其替换即可。

  • 重新启动nginx和php fpm

2

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

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

2

还要检查SELINUX(/ etc / selinux):

# getenforce

把它关掉:

# setenforce 0

1
您绝对不应选择降低系统的安全性以使某些功能正常运行,而应使用其他答案中的许多选项之一来解决您的问题。没有极好的理由不要禁用selinux!
SlyDave

2

只看/etc/php5/php-fpm.conf pid = /var/run/php5-fpm.pidIS PID文件

在文件中 /etc/php5/fpm/pool.d/www.conf

listen = /var/run/php5-fpm.sock IS SOCKET文件

如果您等于监听(pid = /var/run/php5-fpm.sock and listen = /var/run/php5-fpm.sock)->错误的设置并完成设置/etc/php5/fpm/pool.d/www.conf

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

1

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

在升级过程中,我以某种方式完全丢失了php5-fpm可执行文件。所有的配置文件都是完整的,花了我一段时间才意识到它service php5-fpm start并没有真正启动进程,因为它没有显示任何错误。

我觉醒的时刻是,当我发现其中没有/var/run/php5-fpm.sock应有的套接字文件时,也没有netstat -an显示进程在尝试解决此问题的过程中监听我尝试作为替代方法的端口。由于文件/ usr / sbin / php5-fpm也不存在,所以我终于走上了正确的轨道。

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


但是,此升级解决方案可能有其自身的问题。由于php已经发展了很多,因此该软件可能会以无法想象的方式崩溃。因此,即使我确实走了那条路,您也可能希望将自己喜欢的版本保留更长的时间。

幸运的是 似乎有一种整洁的方法,如The Customize Windows网站上所述:

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

可能是更整洁的解决方案,我没有尝试过。我希望接下来的几天会告诉我是否应该。


1

就我而言,php-fpm根本没有运行,所以我只需要启动服务the

service php7.3-fpm start
#on ubuntu 18.04

1

我有类似的错误。

所有建议都无济于事。

用nginx唯一替代www-data有助于:

$ sudo chmod nginx:nginx /var/run/php/php7.2-fpm.sock

/var/www/php/fpm/pool.d/www.conf

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

嗨@Alexander,您需要使用chown命令将所有者更改为nginx。这确实对我有很大帮助。
Pratik Ghela


0

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

过去大部分时间它都运行良好,但是最后我遇到了502网关错误。

我为每个帐户使用一个php fpm套接字,而不是对所有帐户都使用相同的套接字。因此,如果其中一个崩溃,则至少其他应用程序将继续运行。

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

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

在这里,我发现现在我都拥有nginx了,不再有www-data了。

也许这可以帮助某些仍在尝试找出错误消息不断出现的原因的人。

它为我工作。


0

对于那些尝试了该线程中的所有操作但仍然遇到问题的用户:这解决了我的问题。我更新了/usr/local/nginx/conf/nginx.conf

  1. 取消注释行中的注释 user

  2. 使其www-data变为:user www-data;

  3. 保存(需要root访问权限)

  4. 重新启动nginx


0

如果您有声明

pid = /run/php-fpm.pid

听= /运行/ php-fpm.pid

在不同的配置文件中,那么root将是该文件的所有者。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.