エラーログ:
[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-fpm設定でUnixソケットを使用していないと思います。これは、デフォルトでphp-fpmがTCPポートを使用しているためです。
Unixソケットを使用することにしました。
FastCgiExternalServer/usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
したがって、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
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ソケットを使用するようになり、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
ここで、ユーザーがwww-dataかどうかを前の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
そしてショーは続く必要があります:)
Php5-fpmを実行してソケットアドレスをリッスンせずにWebサーバーを起動したようです。 "/ usr/lib/cgi-bin/php5-fcgi"をリッスンアドレス(fpmが受信接続を処理するためのチャネル)として指定する場合は、それがfpm構成に含まれていることを確認する必要があります。 「/etc/php5/fpm/pool.d/www.conf」は、その一般的なパスです。
次に、Apache構成で、.phpファイルがfastcgi_passを使用して要求をfpmに送信していることを確認します。間違った場所にあるUNIXソケットを想定していることを除いて、これを行うようにすでに設定されているようです。