PHP-FPM 无法连接到 FastCGI 服务器

PHP-FPM 无法连接到 FastCGI 服务器

错误日志:

[Sat Nov 22 05:24:41 2014] [error] [client xx] (2)No such file or directory: FastCGI: failed to connect to server "/usr/lib/cgi-bin/php5-fcgi": connect() failed 
[Sat Nov 22 05:24:41 2014] [error] [client xx] FastCGI: incomplete headers (0 bytes) received from server "/usr/lib/cgi-bin/php5-fcgi"

好吧,这个文件/usr/lib/cgi-bin/php5-fcgi确实丢失了,文件夹中实际上什么也没有cgi-bin。当我重新启动 apache2 时,它似乎正常工作:

[Sat Nov 22 04:46:29 2014] [notice] FastCGI: process manager initialized (pid 10747)
[Sat Nov 22 04:46:29 2014] [notice] Apache/2.2.22 (Ubuntu) mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_ssl/2.2.22 OpenSSL/1.0.1 configured -- resuming normal operations

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

<IfModule mod_fastcgi.c>
    AddHandler php5-fcgi .php
    Action php5-fcgi /php5-fcgi
    Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
 </IfModule>

那么我现在该做什么?

答案1

简而言之

我敢打赌,您在 php-fpm 配置中没有使用 Unix Sockets。这是因为默认情况下 php-fpm 使用 TCP 端口。

仔细查看您的配置

您已决定使用 Unix 套接字:

FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header 授权

因此,您需要确保 php-fpm 确实在这些 un​​ix 套接字上运行。

Case 1:你确实在使用 Unix Sockets

$ sudo lsof -U | grep php
// will show you
php-fpm   17330          root    5u  unix 0xf4f64800      0t0 7045381 socket
php-fpm   17330          root    7u  unix 0xf545f080      0t0 7045382 socket
php-fpm   17330          root    8u  unix 0xf55f3a80      0t0 7045383 /var/run/php5-fpm.sock
php-fpm   17331        nobody    0u  unix 0xf55f3a80      0t0 7045383 /var/run/php5-fpm.sock
php-fpm   17331        nobody    0u  unix 0xf55f3a80      0t0 7045383 /var/run/php5-fpm.sock

$sudo lsof -i | grep php
// should show nothing

Case 2:您没有使用 Unix 套接字,而是使用 TCP 端口

$ sudo lsof -U | grep php
// will show you
php-fpm   17330          root    5u  unix 0xf4f64800      0t0 7045381 socket
php-fpm   17330          root    7u  unix 0xf545f080      0t0 7045382 socket

$sudo lsof -i | grep php
php-fpm   13387    root    7u  IPv4 202656      0t0  TCP localhost:cslistener (LISTEN)
php-fpm   13388  nobody    0u  IPv4 202656      0t0  TCP localhost:cslistener (LISTEN)
php-fpm   13389  nobody    0u  IPv4 202656      0t0  TCP localhost:cslistener (LISTEN)

您收到此错误消息很可能是因为您确实没有在 php-fpm 中使用 unix 套接字。原因是 php-fpm 默认配置为使用 tcp 端口。

打开 php-fpm.conf,并更改为 unix 套接字:

sudo nano /etc/php5/fpm/pool.d/www.conf

# We don't want to use TCP ports
#listen = 127.0.0.1:9000

# We want to use Unix Sockets
listen = /var/run/php5-fpm.sock

现在,您将在同一个文件上遇到权限问题:

// modify user and group and use same user as apache (here 'nobody')
user = nobody
group = nobody

// Uncomment those lines and use same user as apache (here 'nobody')
listen.owner = nobody
listen.group = nobody
listen.mode = 0666

PHP-FPM 配置现在使用 Unix Sockets,Apache 将能够连接到它。

答案2

您的fastcgi进程无权读取您的 /usr/lib/cgi-bin/ 目录,因为运行 fastcgi 进程的用户()不属于您的所有者所在的同一组/usr/lib/cgi-bin/目录。

因此,请确保这一点:

$ stat /usr/lib/cgi-bin/

回复 :

bla bla... Uid: ( 33 / www-data ) Gid: ( 33 / www-data )

注意:www-data 是 Apache 的用户

如果没有,请执行以下操作:

$ sudo chown -R www-data:www-data /usr/lib/cgi-bin

现在使用前面的 stat 命令检查用户是否是 www-data。然后,您必须将自己(fastcgi 进程的用户)添加到用户组 www-data,因此:

$ sudo gpasswd -a ${USER} www-data

现已开放/etc/php5/fpm/pool.d/www.conf用你最喜欢的编辑器。

$ sudo nano /etc/php5/fpm/pool.d/www.conf

并取消注释以下几行:

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

重要提示:不要将 listen.mode 改为 666,这样不安全

sudo service apache2 restart
sudo service php5-fpm restart

演出还得继续 :)

答案3

听起来您启动 Web 服务器时没有运行 php5-fpm 并监听套接字地址。如果您想指定“/usr/lib/cgi-bin/php5-fcgi”作为监听地址(fpm 处理进入其中的连接的通道),则需要确保它位于您的 fpm 配置中。“/etc/php5/fpm/pool.d/www.conf”是它的常用路径。

然后在您的 apache 配置中,确保 .php 文件使用 fastcgi_pass 将请求发送到 fpm。听起来它已经设置为这样做了,只是它在错误的位置期望 unix 套接字。

答案4

我必须确保 Apache 对 FastCGI 的引用/etc/apache2/conf-available/httpd.conf

FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/apache2/php-fpm.sock -pass-header Authorization

匹配配置中的监听 PHP FastCGI 进程/etc/php5/fpm/pool.d/www.conf

listen = /var/run/apache2/php-fpm.sock

一旦我将它们匹配,我就会检查 FastCGI 是否确实在正确的 UNIX 套接字上运行,如 @Mick 所述(sudo如果不是以 root 身份运行,则通常使用前缀):

lsof -U | grep php

这表明它仍然是不正确的:

php5-fpm  19438       root    7u  unix 0xffff880002242b40      0t0 79631 socket
php5-fpm  19438       root    8u  unix 0xffff880002242780      0t0 79632 socket
php5-fpm  19438       root    9u  unix 0xffff8800022423c0      0t0 79633 /var/run/php-fpm.sock
php5-fpm  19440   www-data    0u  unix 0xffff8800022423c0      0t0 79633 /var/run/php-fpm.sock
php5-fpm  19441   www-data    0u  unix 0xffff8800022423c0      0t0 79633 /var/run/php-fpm.sock
php5-fpm  19442   www-data    0u  unix 0xffff8800022423c0      0t0 79633 /var/run/php-fpm.sock
php5-fpm  19443   www-data    0u  unix 0xffff8800022423c0      0t0 79633 /var/run/php-fpm.sock

因此重新启动 FastCGI 进程需要获取配置更改:

service php5-fpm restart

相关内容