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修复了一个安全漏洞 ,其中对套接字文件具有权限。
- 打开
/etc/php5/fpm/pool.d/www.conf
或/etc/php/7.0/fpm/pool.d/www.conf
,具体取决于您的版本。 -
取消注释所有权限行,如:
listen.owner = www-data listen.group = www-data listen.mode = 0660
-
重启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.conf
configuration片段
# 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
-
取消注释说
user
的行 -
使它的
www-data
所以它变成:user www-data;
-
保存(需要root权限)
-
重新启动nginx
如果你有声明
pid = /run/php-fpm.pid
和
listen = /run/php-fpm.pid
在不同的configuration文件中,那么root将会拥有这个文件。