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> 

那么我现在该做什么?

简而言之

我敢打赌,你没有在你的php-fpmconfiguration中使用Unix套接字。 这是因为默认情况下,php-fpm正在使用TCP端口。

仔细看看你的configuration

你已经决定使用Unix套接字:

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

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

案例1 :你真的在使用Unix套接字

 $ 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 

情况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默认configuration为使用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-FPMconfiguration现在使用Unix套接字,Apache将能够连接到它。

有可能您的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命令,如果用户是万维网数据。 然后,您必须将自己(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 

演出必须继续:)

这听起来像你已经开始你的Web服务器没有运行php5-fpm和监听套接字地址。 如果你想指定“/ usr / lib / cgi-bin / php5-fcgi”作为监听地址(fpm处理连接的通道),你需要确保它在你的fpmconfiguration中。 “/etc/php5/fpm/pool.d/www.conf”是一个共同的path。

然后在你的apacheconfiguration中,确保.php文件使用fastcgi_pass发送请求到fpm。 这听起来像它已经成立这样做,除了它期待一个unix套接字在错误的位置。