Nginx错误连接到php5-fpm。sock failed(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;
}
350268 次浏览

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

  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. Restart fpm - sudo service php5-fpm restart or sudo service php7.0-fpm restart

Note: if your webserver runs as user other than www-data, you will need to update the www.conf file accordingly

@Xander的解决方案工作,但不坚持后重启。

我发现我必须在/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,我已经将此更改为更安全的方法。

我删除了这条评论。模式,.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。在最近的一次更新之后,这个问题也发生了。

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

我最后做的是将以下几行代码添加到我的PHP-FPM配置文件。

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

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

这样做不会启用安全问题,这个改变应该解决. conf。

事实上,“听”。mode”应该是:“0660”而不是“0666”,因为其他可写或其他可读从来不是一个好的选择。

所以试着找出你的web服务器是作为哪个用户/组运行的。我使用CentOs,它以“nginx”用户运行 所以添加到你的php-fpm.conf:

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

最后重新启动php-fpm

除了在你的php配置中扩大权限,你可以改变你的nginx配置中指定的用户。

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

user  www www;

同时,你的php配置可能会指定一个用户和一组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池。

我不明白为什么今天这些答案都对我不起作用。对我来说,这是一个设定后就忘记的场景,我已经忘记了倾听。用户和监听。组在每个池的基础上进行复制。

如果您像我一样为不同的用户帐户使用池,其中每个用户帐户拥有他们的FPM进程和套接字,只设置默认监听。拥有并倾听。“nginx”的组配置选项将根本不起作用。显然,让“nginx”拥有它们也是不可接受的。

对于每个池,确保

listen.group = nginx

否则,您可以不考虑池的所有权等。

今天我更新了运行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:

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

如果你已经尝试了这篇文章中的所有内容,但都没有成功地让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。应该能行。

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

usermod -a -G www-data nginx

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

只需添加,在CentOS(可能还有Red Hat和Fedora)上,要更改权限的文件位于:

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

我确实在我的服务器上更换了好几次操作系统,试图获得最舒适的系统。

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

我为每个帐户使用一个php fpm套接字,而不是为所有帐户保留同一个套接字。因此,如果一个应用程序崩溃,至少其他应用程序可以继续运行。

我以前有用户和组www-data。但这在我的Debian 8上发生了变化,使用了最新的Nginx 1.8和php5-fpm。

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

它是在那里,我发现现在我有nginx在两者和不再www-data。

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

这对我很管用。

下面的简单修复对我有用,绕过了套接字可能的权限问题。

在你的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/

从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已经发展了很多,软件可能会以难以想象的方式崩溃。所以,即使我真的走了那条路,你可能想要保留你喜欢的版本再久一点。

幸运的是,似乎有一个简单的方法,如自定义Windows网站所述:

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

这可能是一个更简洁的解决方案,但我没有尝试。我希望接下来的几天会告诉我是否应该这样做。

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

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

在我的案例中,问题是Nginx web服务器以用户Nginx运行,而池以用户www-data运行。

我通过改变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

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

打开你的www.conf文件(例如:sudo nano /etc/php-fpm.d/www.conf) 最后,找到设置监听的语句。拥有并倾听。将他们的值从“nobody”改为“nginx”:

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

最后,找到设置用户和组的行,并将它们的值从"apache"改为"nginx":

user = nginx
group = nginx

重启php-fpm (sudo service)

对于那些在这个帖子中尝试了所有方法但仍然卡住的人:这解决了我的问题。 我更新了/usr/local/nginx/conf/nginx.conf

  1. 取消注释user的行

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

  3. 保存它(需要根权限)

  4. 重启nginx

如果你有声明

Pid = /run/php-fpm.pid

而且

Listen = /run/php-fpm.pid

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

检查SELINUX (/etc/ SELINUX):

# getenforce

关掉它:

# setenforce 0

这里最重要的事情是,如果用户正在使用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

在我的例子中,php-fpm根本没有运行,所以我只能启动😂服务

service php7.3-fpm start
#on ubuntu 18.04

请看/etc/php5/php-fpm.conf Pid = /var/run/php5-fpm.pid IS pid文件

. pid文件

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

listen = /var/run/php5-fpm.sock是套接字文件

如果你pid = listen (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

我也犯过类似的错误。

所有的建议都不起作用。

用nginx替换www-data的唯一方法是:

$ sudo chown 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

请注意 (至少以美分计算)你正在分配listen.owner和其他东西给它的用户<强>必须 与用户在相同的中,例如我是喷火用户

[www] # WRONG | IN MY CASE I WAS UNDER www POOL SO IT WASNT WORKING FOR ME.
[foo] # CORRECT | THE POOL AND THE USER MATCHES.


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

我不知道是否有一个全球性的游泳池,但经过几个小时的搜索,我终于做到了。

对我来说,在PHP-FPM监听套接字在www.conf文件中定义/run/php-fpm/php-fpm.sock之前,它是unix:指令 我简单的Nginx配置文件php块看起来像这样

 location ~ \.php$ {
root           /home/mysuser/www;
fastcgi_pass   unix:/run/php-fpm/php-fpm.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
include        fastcgi_params;
}

在这里:

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

但这里也要改变:

; When set, listen.owner and listen.group are ignored
listen.acl_users = apache
;listen.acl_groups =

注释这一行:

; When set, listen.owner and listen.group are ignored
;listen.acl_users = apache
;listen.acl_groups =