FastCGI プラグインは Web Server 7.0 にバンドルされています。次のいずれかの方法で、FastCGI プラグインを Web Server 上に構成できます。
このプラグインは、次の場所にインストールされます。
32 ビットの FastCGI プラグインバイナリは、<install_dir>/plugins/fastcgi ディレクトリにインストールされます。 |
64 ビットの Solaris SPARC FastCGI プラグインバイナリは、<install_dir>/lib/plugins/fastcgi/64 ディレクトリにインストールされます。 |
インストールされる FastCGI バイナリは次のとおりです。
libfastcgi.so (Solaris/Linux 用) |
fastcgi.dll (Windows 用) |
Fastcgistub.exe (Windows 用) |
libfastcgi.sl (HP-UX 用) |
Fastcgistub (実行可能ファイル) |
FastCGI プラグインを構成するには、<instance-dir>/config ディレクトリに格納されている Web Server 構成ファイルを使用します。FastCGI プラグインを構成するには、次の手順を実行します。
「load-modules」Init 関数を使って FastCGI プラグインの共有ライブラリを読み込みます。
Init fn=flex-init access="access" format.access="%Ses->client.ip% - %Req->vars.auth-user% [%SYSDATE%] \"%Req->reqpb.clf-request%\" %Req->srvhdrs.clf-status% %Req->srvhdrs.content-length%" Init fn="load-modules" shlib="libJava EEplugin.so" shlib_flags="(global|now)" Init fn="load-modules" shlib="libfastcgi.so" shlib_flags="(global|now)"
mime.types ファイルを編集して MIME マッピングを指定します。MIME タイプのマッピングの変更は、省略可能な手順です。
次に例を示します。
#--Sun Microsystems Inc. MIME Information # Do not delete the above line. It is used to identify the file type. # # Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # type=application/octet-stream exts=bin type=application/astound exts=asd,asn ... ... type=magnus-internal/fastcgi exts=php ... ...
obj.conf ファイルを編集し、これまでの節で説明したプラグイン SAF を使って FastCGI に固有の要求を構成します。
変更後の obj.conf ファイルの例を、次に示します。
# # Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # You can edit this file, but comments and formatting changes # might be lost when you use the administration GUI or CLI. <object name = "default"> AuthTrans fn="match-browser" browser="*MSIE*" ssl-unclean-shutdown="true" NameTrans fn="ntrans-Java EE" name="Java EE" NameTrans fn="pfx2dir" from="/mc-icons" dir="/ws7/lib/icons" name="es-internal" NameTrans fn="assign-name" from="/fcgi/*" name="fcgi.config" </object> <Object name="fcgi.config"> AuthTrans fn="auth-fastcgi" app-path="/fastcgi/apps/c/simpleAuth" bind-path="localhost:2111" Service fn="responder-fastcgi" app-path="/fastcgi_enabled_php_installation_dir/bin/php" app-env="name1=abc" </object> ...
FastCGI の SAF は、URL パターンごとに異なるオブジェクトを定義したり、SAF を異なる MIME タイプにマップしたりするなど、さまざまな方法で呼び出せます。
obj.conf の構成および構文について詳しくは、『Sun Java System Web Server 7.0 Update 3 Administrator’s Configuration File Reference』の第 6 章「Syntax and Use of obj.conf」を参照してください。
管理コンソールや CLI を使って、複数の FastCGI アプリケーションを構成することはできません。回避策として、obj.conf ファイルを変更することで複数のアプリケーションを構成できます。次に例を示します。
<If> $uri =~ '^/fcgi/(.*)'>
Service fn="responder-fastcgi" app-path="/export/home/bits/fastcgi/fcgi-2.4.0/examples/$1" app-env="LD_LIBRARY_LIBRARY_PATH=/export/home/bits/fastcgi/fcgi-2.4.0/libfcgi/.libs"</If>
この式により、<app-path> プロセスが作成されます。このプロセスを別個に構成する必要はありません。
複数のアプリケーションに対して同一の bind-path を構成することはできません。さもないと、共通の bind-path が原因で起動時に障害が発生します。
仮想ホスティング環境は、複数の仮想サーバー間で PHP エンジンを共有することに伴う、潜在的なセキュリティーおよびパフォーマンスの問題を回避することを主眼にしています。
Web Server 7.0 環境変数を使用して、各仮想サーバーに別個のエンジンがバインドされた同一の PHP バイナリを割り当てることができます。各仮想サーバーが独自の php.ini ファイルを保持していることを確認してください。
Service fn=responder-fastcgi app-path="/path/to/php/php_fcgi" bind-path="$(lc($urlhost))" req-retry=5 type="*magnus-internal/fastcgi*" app-env="PHPRC=/path/to/users/$(lc($urlhost))/config" app-env="PHP_FCGI_CHILDREN=5" app-env="PHP_FCGI_MAX_REQUEST=200" min-procs=1 restart-interval=10 bucket="php-bucket" rlimit_cpu=60 |
これで、Web Server tmp ディレクトリは、PHP 要求を処理する個別の仮想サーバーにちなんで名付けられた Unix ドメインソケットを表示します。これは、すべてのユーザーに対して単一の PHP FastCGI バイナリを使用することで可能になります。このため、単一のバイナリが、それを使ってコンパイルされた必須プラグインをすべて処理するはずです。上記の問題を解決するために、必要に応じて各ユーザーが PHP バイナリの独自コピーを保持していることを確認してください。
Service fn=responder-fastcgi app-path="/path/to/users/$(lc($urlhost))/php_fcgi" bind-path="$(lc($urlhost))" req-retry=5 type="*magnus-internal/fastcgi*" app-env="PHPRC=/path/to/users/$(lc($urlhost))/config" app-env="PHP_FCGI_CHILDREN=5" app-env="PHP_FCGI_MAX_REQUEST=200" min-procs=1 restart-interval=10 bucket="php-bucket" rlimit_cpu=60 |
URI 空間の構造を制御することにより、アプリケーションごとに異なる PHP バイナリを使用することも可能です。
次に例を示します。
URI 空間の構造が次のようになっている場合を例に挙げます。
/app/foo.php
ここで、/app はアプリケーション全体の名前であり、常に PHP ファイルで終わる URI 構造内の最初のディレクトリです。
<If uri~=^/(\w+)/\w+\.php$> Service fn=responder-fastcgi app-path="/path/to/users/$(lc($urlhost))/$1/php_fcgi" bind-path="$(lc($urlhost))_$1" req-retry=5 type=+magnus-internal/fastcgi*" app-env="PHPRC=/path/to/users/$(lc($urlhost))/config" app-env="PHP_FCGI_CHILDREN=5" app-env="PHP_FCGI_MAX_REQUEST=200" min-procs=1 restart-interval=10 bucket="php-bucket" rlimit_cpu=60 </If> |
これにより、明確に構築された PHP FastCGI バイナリが呼び出され、一意の名前を付けられた Unix ドメインソケットにバインドされます。このため、別の PHP アプリケーションや別の仮想サーバーと干渉することはありません。ただし、このプロセスに伴って多数の PHP プロセスが実行されるため、大量のメモリーが消費されます。
次に、FastCGI を使って PHP を構成する構成ファイルのサンプルを示します。
<If -f $path> Service type="magnus-internal/php" fn="responder-fastcgi" app-path="/opt/coolstack/php5/bin/php-cgi" bind-path="localhost:3101" app-env="PHPRC=/opt/coolstack/php5" app-env="PHP_FCGI_CHILDREN=5" app-env="PHP_FCGI_MAX_REQUEST=200" app-env="FCGI_WEB_SERVER_ADDRS=127.0.0.1" req-retry=5 restart-interval=10 bucket="php-bucket" </If> <Else> Service type="magnus-internal/php" fn="set-variable" error="404" </Else>
Fastcgistub は、FastCGI アプリケーションプロセスのライフサイクルを管理するプロセスマネージャーです。Fastcgistub は、Web Server の一時ディレクトリの下の Fastcgistub.log ファイルに、自身のメッセージを記録します。エラーが発生した場合、このファイルをチェックすると問題のデバッグが容易になる可能性があります。
問題: FastCGI の要求が処理されない
可能性のある原因とその解決法は、次のとおりです。
FastCGI プラグインが読み込まれているかチェックします。Web Server の起動時に次のメッセージが表示されれば、このプラグインは正常に読み込まれています。そうでない場合は、magnus.conf でプラグインライブラリへのパスをチェックします。 FCGI1000: Sun Java System Web Server 7.0 Update 3 FastCGI NSAPI Plugin <ビルド情報>
obj.conf で要求のマッピングが正しく指定されているかチェックします。obj.conf ファイルの詳細については、『Sun Java System Web Server Administrator's Configuration Reference File』を参照してください。
エラーログにエラーメッセージが含まれていないかチェックします。
スタブバイナリと FastCGI アプリケーションのアクセス権をチェックします。十分なアクセス権が与えられていない場合、プラグインはスタブまたはアプリケーションの起動に失敗します。
Fastcgistub.log ファイルにスタブ側のエラーが含まれていないかチェックします。ログの詳細は、<instances>/logs 内にあります。
可能であれば、FastCGI アプリケーションをスタンドアロンモードで実行し、アプリケーションが問題なく実行されるかチェックします。
ライブラリの依存関係に関するエラーがスローされた場合には、LD_LIBRARY_PATH=<依存関係のあるライブラリのパス> を値に持つ app-env パラメータとして、obj.conf 内で LD_LIBRARY_PATH を指定します。
問題: FastCGI アプリケーションが起動されない。
可能性のある原因とその解決法は、次のとおりです。
Fastcgistub.log ファイルに次のログメッセージが含まれていないかチェックします。 |
.. <pid> process startup failure, trying to restart ... Even after trying <n> time(s), <application path> process failed to start...no more retries
起動が失敗する原因の 1 つとして、依存関係のあるライブラリの読み込みに失敗していることが考えられます。obj.conf ファイル内で構成されている FastCGI アプリケーションへの app-env パラメータの値として、適切なライブラリパスを指定すれば、この問題を解決できます。次に例を示します。
Service fn="responder_fastcgi" app-path="/fastcgi/c/tux-app" bind-path="localhost:2112" app-env="LD_LIBRARY_PATH=/tuxedo/lib" |
FastCGI アプリケーションの開発は、Perl、PHP、C、および Java を使って行えます。次の各節では、広く普及しているいくつかのプログラミング言語を使ってアプリケーションを開発する手順について、簡単に説明します。
Web Server を停止します。
Web Server を再起動します。
「fcgi」をアプリケーションルートに持つアプリケーションにアクセスします。
例: http://localhost/fcgi/ListDir.php
典型的な FastCGI アプリケーションのコードは、次の構造を持ちます。
Initialization code Start of response loop body of response loop End of response loop
初期化コードが実行されるのは、アプリケーションの初期化時に 1 回だけです。初期化コードは通常、データベースのオープンや、テーブルまたはビットマップの値の計算など、時間のかかる処理を実行します。CGI プログラムを FastCGI プログラムに変換する場合の主なタスクは、初期化コードと、要求ごとに実行する必要のあるコードとを分離することです。
応答ループは継続的に実行され、クライアント要求が到着するのを待ちます。このループはまず、FastCGI ライブラリのルーチン FCGI_Accept を呼び出します。FCGI_Accept ルーチンは、クライアントが FastCGI アプリケーションを要求するまで、プログラムの実行をブロックします。クライアント要求が到着すると、FCGI_Accept はブロックを解除し、応答ループの本体を 1 回実行したあと再度ブロックし、別のクライアント要求の到着を待ちます。このループが終了するのは、システム管理者または Web Server が FastCGI アプリケーションを終了した場合だけです。
最新の FCGI モジュールを CPAN からダウンロードしてインストールします。ActivePerl の場合は、モジュールを http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/Zips からダウンロードできます。
Perl を使って FastCGI アプリケーションを記述する方法の詳細については、http://www.fastcgi.com/#TheDevKit を参照してください
PHP 4.3.0 以降、FastCGI が PHP エンジンのサポートされた構成の 1 つになりました。PHP 4.3.x 以上のエンジンを FastCGI サポートを有効にしてコンパイルするには、次のように、構成スイッチ --enable-fastcgi をビルド処理の一部として含めます。
./configure <other-options> --enable-fastcgi gmake |
コンパイルが完了すると、php バイナリが FastCGI 対応になります。
PHP バージョン 5.1.2 以前 (PHP 4.x を含む) を使用する場合は、 host:port 形式の bind-path を使って FastCGI プラグインを構成するようにしてください。たとえば、bind-path = “localhost: 3333”のようにします。
PHP バージョン 5.1.3 以降の場合、bind-path は省略可能になります。指定する場合は、「host:port」形式を 使用しないようにしてください。文字列で表します。たとえば、bind-path = “myphpbindpath”のようにします。
FastCGI 開発キットは、FastCGI C/Java アプリケーションを開発するための API を提供します。このキットは http://www.fastcgi.com/devkit/doc/fcgi-devel-kit.htm からダウンロードできます。
ダウンロードした FastCGI 開発キットをビルドするには、次の手順を実行します。
tar ファイルを展開します。このアクションにより、fcgi-devel-kit という名前の新しいディレクトリが作成されます
fcgi-devel-kit ディレクトリ内で次の一連のコマンドを実行します。
./configure
make
C を使って FastCGI アプリケーションを記述する方法の詳細については、http://www.fastcgi.com/devkit/doc/fcgi-devel-kit.htm#S3 を参照してください。
Java を使って FastCGI アプリケーションを記述する方法の詳細については、http://www.fastcgi.com/devkit/doc/fcgi-java.htm を参照してください。
FastCGI 対応の Sun Java System Web Server 7.0 PHP Add-On 1.0 を http://www.sun.com/download/index.jsp からダウンロードします。
Web Server 上で PHP を FastCGI サーバーとして構成します。
phppack-5_2_0*.zip を /export/home に展開します。
$ cd /export/home; unzip phppack-5_2_0*.zip |
管理サーバーを起動します。
$ <webserver-install-root>/admin-server/bin/startserv |
管理コンソールを使用して FastCGI ハンドラを構成します。
管理コンソールにログインします。
「仮想サーバータスク」から「仮想サーバーを編集」をクリックします。
「仮想サーバーの一般プロパティー」で「コンテンツ処理」タブをクリックします。
「コンテンツ処理 — 一般プロパティー」で「FastCGI」タブをクリックします。
「新規」ボタンをクリックして、FastCGI ハンドラマッピングを備えた新しい URI を追加します。
次の値を入力します。
「適用先」: 「新規 URI」を選択して、/fastcgi/* を入力します。
「ロール」: ドロップダウンリストから「レスポンダ」を選択します。
「アプリケーションパス」: パスとして /export/home/php/bin/php を入力します。
「環境変数」: 変数を入力します。
"PHPRC=/export/home/php","LD_LIBRARY_PATH=/export/home/php", "LD_LIBRARY_PATH_64=/export/home/php/64" |
「了解」ボタンをクリックします。必要に応じて、構成の「配備」ボタンをクリックしなければいけない可能性があります。
シンボリックリンクを作成します。
$ ln -s <webserver-install-root>/samples/fastcgi <webserver-instance-docroot> |
サンプルを実行します。
Hello World サンプルの URL
http://<host-name>:<webserver-instance-port>/fastcgi/HelloWorld.php
ディレクトリ一覧表示サンプルの URL
http://<host-name>:<webserver-instance-port>/fastcgi/directory.php
ページカウンタサンプルの URL
http://<host-name>:<webserver-instance-port>/fastcgi/pageCounter.php
サーバー情報サンプルの URL
http://<host-name>:<webserver-instance-port>/fastcgi/serverinfo.php
FastCGI ハンドラ関連の CLI コマンドには、次の 5 つがあります。
次のコマンドを呼び出して、FastCGI ハンドラを作成します。
wadm> create-fastcgi-handler --config=test --vs=test --uri-pattern=/php/* --role=filter --app-path=C:\\php\\phppack-5_2_0-windows-i586\\php\\php-cgi.exe |
Filter をロールとする FastCGI ハンドラが作成されます。
詳細は、CLI リファレンスの create-fastcgi-handler(1) を参照してください。
コマンドを呼び出して、構成を配備します。
wadm> deploy-config test |
FastCGI ハンドラを初めて作成する場合は、構成を配備したあとでインスタンスを再起動してください。
wadm> restart-instance --config=test localhost |