Sha*_*ane 8 mod-fastcgi apache-2.2
错误日志:
[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"
Run Code Online (Sandbox Code Playgroud)
嗯,这个文件/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
Run Code Online (Sandbox Code Playgroud)
/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>
Run Code Online (Sandbox Code Playgroud)
那我现在该怎么办?
小智 9
我敢打赌,您没有在 php-fpm 配置中使用 Unix 套接字。这是因为默认情况下 php-fpm 使用 TCP 端口。
您已决定使用 Unix 套接字:
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header 授权
因此,您需要确保 php-fpm 确实在那些 unix 套接字上运行。
Case 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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
您很可能会收到此错误消息,因为您确实没有在 php-fpm 中使用 unix 套接字。原因是,php-fpm 默认配置为使用 tcp 端口。
打开 php-fpm.conf,并更改为 unix sockets:
须藤纳米/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
Run Code Online (Sandbox Code Playgroud)
现在,您将在同一个文件上遇到权限问题:
// 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
Run Code Online (Sandbox Code Playgroud)
PHP-FPM 配置现在使用 Unix 套接字,Apache 将能够连接到它。
听起来您已经启动了 Web 服务器,而没有运行 php5-fpm 并监听套接字地址。如果您想指定“/usr/lib/cgi-bin/php5-fcgi”作为监听地址(fpm 处理进入其中的连接的通道),您需要确保它位于您的 fpm 配置中。“/etc/php5/fpm/pool.d/www.conf”是它的常用路径。
然后在您的 apache 配置中,确保 .php 文件使用 fastcgi_pass 将请求发送到 fpm。听起来它已经被设置为执行此操作,但它期望 unix 套接字位于错误的位置。