FAQ

Page Discussion Edit History

FcgiExampleJa

(Redirected from NginxFcgiExampleJa)

まず始めに、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;
  }
}