PHPFcgiExampleJa

まず始めに、FCGIに関するすべての設定は1つのファイルにまとめた上でそのファイルをインポートするようにお勧めします.

例えば /etc/nginx/fastcgi.conf (Debianでは標準で/etc/nginx/fcgi_paramsにインストールされます) という設定ファイルに次のように記述すると良いでしょう:

fastcgi_param GATEWAY_INTERFACE  CGI/1.1; fastcgi_param SERVER_SOFTWARE    nginx; fastcgi_param QUERY_STRING       $query_string; fastcgi_param REQUEST_METHOD     $request_method; fastcgi_param CONTENT_TYPE       $content_type; fastcgi_param CONTENT_LENGTH     $content_length; fastcgi_param SCRIPT_FILENAME    $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME        $fastcgi_script_name; fastcgi_param REQUEST_URI        $request_uri; fastcgi_param DOCUMENT_URI       $document_uri; fastcgi_param DOCUMENT_ROOT      $document_root; fastcgi_param SERVER_PROTOCOL    $server_protocol; fastcgi_param REMOTE_ADDR        $remote_addr; fastcgi_param REMOTE_PORT        $remote_port; fastcgi_param SERVER_ADDR        $server_addr; fastcgi_param SERVER_PORT        $server_port; fastcgi_param SERVER_NAME        $server_name;
 * 1) fastcgi.conf

これによって個別のFCGIの設定をできる限りシンプルにすることができます.

SCRIPT_FILENAME や DOCUMENT_ROOT を実際のパスに変更してもかまいません. 変数 $document_root はハードコードされており、あなたの設定に合っていないかもしれません. (合致していない場合は通常 'script not found' エラーが生じます)

Nginx + Virtual Host + PHP を利用する場合、PHP が正しい DOCUMENT_ROOT を利用できるように変数 SCRIPT_NAME を省略する必要があります.

FastCGIプロセスを生成する
ApacheやLighttpdと違い、NginxはFCGIプロセスを自動的には生成しません. そのためFCGIプロセスは別途実行させる必要があります. FCGIを実行するにはいくつか方法がありますが、幸運なことに PHP5 には環境変数 PHP_FCGI_CHILDREN で指定しただけ自動的に生成してくれる機能があります. このため、単純に "php -b 127.0.0.1:9000" と手動で実行したり、以下のような init script をつくるだけで大丈夫です.

BIND=127.0.0.1:9000 USER=www-data PHP_FCGI_CHILDREN=15 PHP_FCGI_MAX_REQUESTS=1000
 * 1) !/bin/bash

PHP_CGI=/usr/bin/php-cgi PHP_CGI_NAME=`basename $PHP_CGI` PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND" RETVAL=0

start { echo -n "Starting PHP FastCGI: " start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS RETVAL=$? echo "$PHP_CGI_NAME." } stop { echo -n "Stopping PHP FastCGI: " killall -q -w -u $USER $PHP_CGI RETVAL=$? echo "$PHP_CGI_NAME." }

case "$1" in   start)      start  ;;    stop) stop ;;   restart)      stop      start  ;;    *) echo "Usage: php-fastcgi {start|stop|restart}" exit 1 ;; esac exit $RETVAL

これを /etc/init.d/ (または同様の init スクリプトを置くディレクトリ) に php-fcgi という名前で保存し、 いつもの方法でインストールを行い(例えばdebian の場合は update-rc.d php-fcgi defaults)、起動してください.

実行中のFastCGIプロセスをNginxに接続する
これでFCGIプロセスが実行されましたので、NginxにリクエストをFCGIプロトコルでFCGIプロセスへプロキシさせましょう.

location ~ \.php$ { include /etc/nginx/fcgi_params; fastcgi_pass 127.0.0.1:9000; }

設定が済んだらNginxを再起動させます.

アップロード用ディレクトリはセキュアに!!
非常に多くの設定例でアプリケーションのアップロード用ディレクトリを安全に設定できていません. もしxyz.phpというファイルを誰でもアクセス可能なディレクトリにアップロードできる場合、攻撃者が任意のPHPコードの実行できる状態になっていることになります.

例えば、"/images/"というアップロード用ディレクトリをアプリケーションが使うならば、次のように設定しておきましょう.

location ~ \.php$ { include /etc/nginx/fastcgi_params; if ($uri !~ "^/images/") { fastcgi_pass 127.0.0.1:9000; } }