ここでは、Unix システム上の Lighttpd 1.4 で PHP を使用する際の注意点とヒントをまとめます。
まず » Lighttpd trac で Lighttpd のインストール方法をよく読んでからこれ以降に進みましょう。
PHP と Lighttpd を組み合わせる際におすすめの SAPI は fastcgi です。 fastcgi は PHP 5.3 以降の php-cgi では自動的に有効になりますが、 それより前のバージョンの場合は php の configure 時に --enable-fastcgi を指定しなければなりません。 PHP で fastcgi が有効になっているかどうかを調べるには、 php -v の結果が PHP 5.2.5 (cgi-fcgi) のようになっているかどうかを確認します。 PHP 5.2.3 以前の場合は、(php-cgi ではなく) php バイナリで fastcgi が使えるようになります。
Lighttpd から php に接続して fastcgi プロセスを立ち上げさせるよう設定するには、 lighttpd.conf を編集します。ローカルシステムの fastcgi プロセスに接続するにはソケットの使用をおすすめします。
例1 lighttpd.conf の抜粋
server.modules += ( "mod_fastcgi" ) fastcgi.server = ( ".php" => (( "socket" => "/tmp/php.socket", "bin-path" => "/usr/local/bin/php-cgi", "bin-environment" => ( "PHP_FCGI_CHILDREN" => "16", "PHP_FCGI_MAX_REQUESTS" => "10000" ), "min-procs" => 1, "max-procs" => 1, "idle-timeout" => 20 )) )
bin-path ディレクティブにより、lighttpd が fastcgi プロセスを動的に起動できるようになります。 PHP は、環境変数 PHP_FCGI_CHILDREN の内容に応じて子プロセスを起動します。 "bin-environment" ディレクティブは、起動するプロセスの環境を設定します。 リクエストの数が PHP_FCGI_MAX_REQUESTS の値に達すると、 PHP は子プロセスを kill します。ディレクティブ "min-procs" および "max-procs" は、PHP での使用は避けるべきです。 PHP は自身の子プロセスを自前で管理しますし、 APC のような opcode キャッシュは PHP が管理する子プロセスしか共有しません。 "min-procs" を 1 より大きい値に設定すると、 PHP レスポンダの数が PHP_FCGI_CHILDREN にその値をかけたものとなります (2 min-procs * 16 子プロセスで 32 のレスポンダとなります)。
Lighttpd には spawn-fcgi というプログラムが含まれており、 fastcgi プロセスの起動を簡単に行えるようになっています。
spawn-fcgi なしでプロセスを起動することもできますが、多少難易度が上がります。 環境変数 PHP_FCGI_CHILDREN で、PHP がリクエストの処理用に起動する子の数を設定します。 PHP_FCGI_MAX_REQUESTS は、各子プロセスの生存期間 (リクエスト数) を設定します。php レスポンダを起動するシンプルな bash スクリプトの例を以下に示します。
例2 FastCGI レスポンダの起動
#!/bin/sh # php-cgi バイナリの場所 PHP=/usr/local/bin/php-cgi # PID ファイルの場所 PHP_PID=/tmp/php.pid # アドレスへのバインド #FCGI_BIND_ADDRESS=10.0.1.1:10000 # ドメインソケットへのバインド FCGI_BIND_ADDRESS=/tmp/php.sock PHP_FCGI_CHILDREN=16 PHP_FCGI_MAX_REQUESTS=10000 env -i PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN \ PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS \ $PHP -b $FCGI_BIND_ADDRESS & echo $! > "$PHP_PID"
fastcgi インスタンスを複数のリモートマシンで起動して、 アプリケーションの規模を拡大することができます。
例3 リモートの php-fastcgi インスタンスへの接続
fastcgi.server = ( ".php" => (( "host" => "10.0.0.2", "port" => 1030 ), ( "host" => "10.0.0.3", "port" => 1030 )) )