FcgiExampleJa
まず始めに、FCGIに関するすべての設定は1つのファイルにまとめた上でそのファイルをインポートするようにお勧めします。
例えば /etc/nginx/fastcgi.conf (Debianでは標準で/etc/nginx/fcgi_paramsにインストールされます) という設定ファイルに次のように記述すると良いでしょう:
#fastcgi.conf 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;
これによって個別のFCGIの設定をできる限りシンプルにすることができます。
SCRIPT_FILENAME や DOCUMENT_ROOT を実際のパスに変更してもかまいません。変数 $document_root はハードコードされており、あなたの設定に合っていないかもしれません。 (合致していない場合は通常 'script not found' エラーが生じます)
Nginx + Virtual Host + PHP を利用する場合、PHP が正しい DOCUMENT_ROOT を利用できるように変数 SCRIPT_NAME を省略する必要があります。
[edit] FastCGIプロセスを生成する
ApacheやLighttpdと違い、NginxはFCGIプロセスを自動的には生成しません。そのためFCGIプロセスは別途実行させる必要があります。 FCGIを実行するにはいくつか方法がありますが、幸運なことに PHP5 には環境変数 PHP_FCGI_CHILDREN で指定しただけ自動的に生成してくれる機能があります。 このため、単純に "php -b 127.0.0.1:9000" と手動で実行したり、以下のような init script をつくるだけで大丈夫です。
#!/bin/bash
BIND=127.0.0.1:9000
USER=www-data
PHP_FCGI_CHILDREN=15
PHP_FCGI_MAX_REQUESTS=1000
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)、起動してください。
[edit] 実行中のFastCGIプロセスをNginxに接続する
これでFCGIプロセスが実行されましたので、NginxにリクエストをFCGIプロトコルでFCGIプロセスへプロキシさせましょう。
location ~ \.php$ { include /etc/nginx/fcgi_params; fastcgi_pass 127.0.0.1:9000; }
設定が済んだらNginxを再起動させます。
[edit] アップロード用ディレクトリはセキュアに!!
非常に多くの設定例でアプリケーションのアップロード用ディレクトリを安全に設定できていません。 もしxyz.phpというファイルを誰でもアクセス可能なディレクトリにアップロードできる場合、攻撃者が任意のPHPコードの実行できる状態になっていることになります。
例えば、"/images/"というアップロード用ディレクトリをアプリケーションが使うならば、次のように設定しておきましょう。
location ~ \.php$ { include /etc/nginx/fastcgi_params; if ($uri !~ "^/images/") { fastcgi_pass 127.0.0.1:9000; } }









