ウェブ、ショウジン

Nginx: nginxでPHPを動かすときにいくつかハマったところ

2011-12-20
Category
Server

nginxでPHPを動かすにあたっていろいろと躓いたところをざざざっと残しておく。

自分がしている、しようとしていることをちゃんと理解した上でやっていればおそらくならなかったであろうこともあるけれど、それでも英語圏で探したら(日本語圏ではこの時点では参考になる記事がなかった)同じところでハマっている人とそれにアドバイスしている人がいたので、やっぱり残しておく。

コンパイルエラー

spawn-fcgiをソースからコンパイルしてインストールしようとしたらmakeでコンパイルエラー。

これは単純にgccが入ってなかったからだったので以下のコマンドでインストール。

$ sudo apt-get install gcc

gccがインストールされていない状態でmakeしようとするとこんなふうに。

~/spawn-fcgi-1.6.3$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/home/showjin/spawn-fcgi-1.6.3':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details.

gccをインストールしてからspawn-fcgiをmake、続けてmake installすれば大丈夫なはず。

spawn-fcgiが起動できない

つまずいたところはインストールや必要な設定ファイルを用意した後、起動のところだけど、一応そこに至るまでの過程も含めて残しておく。

前述の流れでspawn-fcgiがインストールできたら
/etc/init.d/php-fastcgiを作成する。

/etc/init.d/php-fastcgi

#!/bin/bash
### BEGIN INIT INFO
# Provides:          php-fastcgi
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the php-fastcgi
# Description:       starts the php-fastcgi
### END INIT INFO

PHP_SCRIPT=/usr/bin/php-fastcgi
FASTCGI_USER=www-data
RETVAL=0
PIDFILE=/var/run/php5-cgi.pid
case "$1" in
    start)
        su - $FASTCGI_USER -c $PHP_SCRIPT
        pidof php5-cgi > $PIDFILE
        RETVAL=$?
    ;;
    stop)
        killall -9 php5-cgi
        echo '' > $PIDFILE
        RETVAL=$?
    ;;
    restart)
        killall -9 php5-cgi
        su - $FASTCGI_USER -c $PHP_SCRIPT
        pidof php5-cgi > $PIDFILE
        RETVAL=$?
    ;;
    *)
    echo "Usage: php-fastcgi {start|stop|restart}"
    exit 1
    ;;
esac
exit $RETVAL
console output

作成したら保存して、以下のコマンドを実行してspawn-fcgiを起動。

$ sudo chmod 755 /etc/init.d/php-fastcgi
$ update-rc.d php-fastcgi defaults
$ sudo /etc/init.d/php-fastcgi start
spawn-fcgi: bind failed: Address already in use

最終行にあるメッセージのようにbind failedということで起動できない。spawn-fcgiが使うAddressがすでになんかに使われてしまっているからということっぽいけれど、その「Address」の意味がよくわかっていないので対処できない。

エラーメッセージで検索してみたら日本語圏で参考になりそうなものは見当たらず、あきらめて英語圏で探すことにする。

参考URL
http://serverfault.com/questions/240702/start-fastcgi-error-in-nginx

スクリーンショット(2011-12-20 17.17.31)

Answerのところにあるように、以下のコマンドを実行。

$ sudo netstat -tpan |grep "LISTEN"|grep :9000

すると

$ sudo netstat -tpan |grep "LISTEN"|grep :9000
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      2893/php5-cgi

ということに。

The last column gives you PID / process name. Just do a kill -9 PID

とあるんだけど、どうも自分で打ったコマンドが外れているらしいので再度検索。

参考URL
https://www.linode.com/forums/archive/o_t/t_5456/search.php

スクリーンショット(2011-12-20 17.23.30)

mjrichさんが答えている「killall 」あたりが鍵っぽいので、このとおり「sudoでprocessnameをkillall」してみる。(processnameは一つ前のコマンドでphp5-cgiとわかったので)

$ sudo killall php5-cgi

そして再度
$ sudo netstat -tpan |grep “LISTEN”|grep :9000

を実行すると、もう何もでてこなくなった。ということは、、ということはもうspawn-fcgiが使うAddressは空いたということだろうか。

ということで、あらためてphp-fastcgi startを実行してみる。

$ sudo /etc/init.d/php-fastcgi start
spawn-fcgi: child spawned successfully: PID: 9673

successfullyということで、今度は起動が成功した模様。

だがしかーし。

.phpが処理されず「No input file specified.」と表示される。

これはPHPスクリプトがどこにあるか定義されていないから見つけられず、なので処理できないということらしい。

なので、設定ファイル(nginxの)を確認して、しかるべきところに記述を追加することにする。

サーバの設定ファイル(nginxの設定ファイル)は、なんか大元?になる「nginx.conf」と、バーチャルホストで複数を運用する場合はサイト(ドメイン)ごとにsites-available以下にある。(ようだ)

その大元の設定ファイルに記述するやり方と、サイトごとの設定ファイルに記述するやり方の両方を試して、結局は後者を選択。

例えば、mysite.comの場合は
/etc/nginx/sites-available/mysite.com
のserverブロックの中のlocationブロック(こんな言い方するか知らないけど)に以下のように記述する。

location ~ \.php$ {
	include /etc/nginx/fastcgi_params;
	fastcgi_pass    127.0.0.1:9000;
	fastcgi_index   index.php;
	fastcgi_param   SCRIPT_FILENAME /var/www/mysite.com/public_html$fastcgi_script_name;
}

もう忘れちゃったけど、たぶん最後のfastcgi_paramの記述が間違っていたのではないかと思う。

この記述をしてから設定を反映させるためにnginxを再起動($ sudo /etc/init.d/nginx restart)させたら、ようやっと.phpファイルを表示できるようになった。

Categories

Tag Cloud

AdMob Android Apache centos CodeIgniter EC-CUBE facebookアプリ facebookページ feed Firefox Flash google googleanalytics htaccess iPad iPhone JavaScript lamp mobile nginx ogp pear php plugin rollover rss sendmail setting smarty ssh Titanium Mobile Titanium Studio tutorial ubuntu vim VirtualBox vmware vps Windows WordPress xampp youtube さくらインターネット アクセス解析 カスタム投稿