FastCGI は、外部アプリケーションと Web サーバー間の標準インタフェースである既存の CGI (Common Gateway Interface) を拡張したものです。FastCGI アプリケーションは CGI と同じく、隔離された個別のプロセス内で実行されます。FastCGI を使用する利点を次にいくつか示します。
クライアント要求をまたがってアプリケーションが持続できるため、アプリケーション起動によるオーバーヘッドが解消される。さらに、クライアント呼び出しをまたがってアプリケーションの状態を維持できる。
アプリケーションがリモートシステム上 (Web Server が稼働しているのとは異なるシステム上) に存在できる。
クライアント認証および入力のフィルタリングを行うアプリケーションが明示的にサポートされるため、アプリケーション機能の柔軟性が高まる。
FastCGI サーバーに起因するシステムへの影響を、管理者が制限できる。
FastCGI プラグインを使えば、Perl や Python など、広く普及しているサードパーティーの動的コンテンツ生成テクノロジと Web Server との安全な連携動作を、高いスケーラビリティーを維持するかたちで実現できます。
FastCGI の詳細については、http://www.fastcgi.com/devkit/doc/fcgi-spec.html の仕様書を参照してください。
FastCGI プラグインが提供するサーバーアプリケーション関数 (SAF) は、次のとおりです。
FastCGI SAF の各種パラメータと「error-reason」文字列については、次の各節で説明します。
auth-fastcgi は PatchCheck 関数です。この関数は、「オーソライザ」FastCGI アプリケーションに要求を転送するために使用されます。承認が成功すると、リターンコード 200 が送信されます。それ以外の場合は、「オーソライザ」FastCGI アプリケーションからの応答がユーザーエージェントに送り返されます。
FastCGI のロールの詳細については、http://www.fastcgi.com/devkit/doc/fcgi-spec.html#S6 を参照してください。
auth-fastcgi SAF が受け付けるパラメータについては、 「FastCGI SAF パラメータ」を参照してください。
次の obj.conf コード例は、auth-fastcgi の使用方法を示したものです。
PathCheck fn="auth-fastcgi" app-path="/usr/bin/perl" app-args="/fastcgi/apps/auth/SimpleAuth.pl" bind-path="localhost:3432".
responder-fastcgi は Service 関数です。この関数は、「レスポンダ」として機能する FastCGI アプリケーションに要求を転送するために使用されます。レスポンダアプリケーションからの応答は、ユーザーエージェントに送り返されます。FastCGI のロールの詳細については、http://www.fastcgi.com/devkit/doc/fcgi-spec.html#S6 を参照してください。
responder-fastcgi SAF が受け付けるパラメータの一覧については、 「FastCGI SAF パラメータ」 を参照してください。
次の obj.conf コード例は、responder-fastcgi の使用方法を示したものです。
Service fn="responder-fastcgi" app-path="/fastcgi-enabled-php-installation/bin/php" bind-path="localhost:3433" app-env="PHP_FCGI_CHILDREN=8" app-env="PHP_FCGI_MAX_REQUEST=500" .
filter-fastcgi は Service 関数です。この関数は、「フィルタ」タイプの FastCGI アプリケーションに要求を転送するために使用されます。「フィルタ」アプリケーションは、HTTP 要求に関連付けられた情報と、サーバー上に格納されたファイルからのデータを受け取ります。次に、「フィルタ」アプリケーションは、「フィルタリング」されたバージョンのデータストリームを応答として生成します。これがユーザーエージェントに送り返されます。FastCGI のロールの詳細については、http://www.fastcgi.com/devkit/doc/fcgi-spec.html#S6 を参照してください。
filter-fastcgi SAF が受け付けるパラメータの一覧については、 「FastCGI SAF パラメータ」 を参照してください。
次の obj.conf コード例は、filter-fastcgi の使用方法を示したものです。
Service fn="filter-fastcgi" app-path="/fastcgi/apps/filter/SimpleFilter" bind-path="localhost:3434" app-env="LD_LIBRARY_PATH=/fastcgi/fcgi-2.4/libfcgi/.libs" min-procs=2
error-fastcgi は Error 関数です。error-fastcgi SAF は、FastCGI プラグインに固有のエラーを処理します。一方、この関数は HTTP エラーを処理しません。エラー時に特定のページを表示するか特定の URL に要求をリダイレクトするように、FastCGI プラグインを構成することができます。
error-fastcgi SAF が受け付けるパラメータの一覧については、 「FastCGI SAF パラメータ」を参照してください。
次の obj.conf コード断片は、error-fastcgi の使用方法を示したものです。
Error fn="error-fastcgi" error-reason="Invalid Parameters" error-url="http://www.foo.com/errorPage.html"
error-fastcgi パラメータの詳細については、「FastCGI SAF パラメータ」を参照してください。
FastCGI プラグインの SAF「auth-fastcgi」、「responder-fastcgi」、および「filter-fastcgi」はすべて、特に明記されていないかぎり、次のパラメータを受け付けます。
bind-path - (省略可能) UNIX ドメインソケット名、名前付きパイプ、形式「host:port」のいずれかになります。「app-path」パラメータの説明のなかで、「bind-path」パラメータの使用方法が説明されています。
app-path - (省略可能) 要求を処理する FastCGI アプリケーションのパス。その機能は次のように、bind-path パラメータの値に依存します。
app-path のみが指定された場合、プラグインは、プラグインによって作成された UNIX ドメインソケットまたは名前付きパイプを待機する FastCGI アプリケーションを作成します。
app-path と bind-path がどちらも指定された場合、プラグインは、指定された FastCGI アプリケーションのプロセスを起動し、それを指定された bind-path にバインドします。
bind-path のみが指定された場合、FastCGI アプリケーションはリモートで実行されているものとみなされます。このため、プラグインは、FastCGI アプリケーションのプロセスを起動しません。
「app-path」、「 bind-path」がどちらも指定されなかった場合、プラグインはログにエラーメッセージを記録します。
app-args — (省略可能) FastCGI アプリケーションプロセスへの引数として渡される値。app-args パラメータは複数指定できます。app-args パラメータを複数指定する場合の形式は、app-args="value" app-args="value" ... です
app-env - (省略可能) FastCGI アプリケーションプロセスに環境変数として渡される値ペア。「app-env」パラメータは複数指定できます。app-env パラメータを複数指定する場合の形式は、app-env="name=value" app-env="name=value" です。既存の Web Server 環境変数は、FastCGI プログラムには渡されません。このため、app-env を使用して、FastCGI プログラムの環境変数を明示的に設定してください。
PHP プログラムをコンパイルする場合は、ライブラリファイルが正しく構成されていることを確認してください。
たとえば、FastCGI アプリケーションとしてコンパイルした PHP バイナリを読み込む場合は、依存関係のあるすべてのライブラリファイル /usr/local/lib および /usr/local/mysql/lib が LD_LIBRARY_PATH にエクスポートされていることを確認する必要があります。
app-env="LD_LIBRARY_PATH=/usr/local/lib:/usr/local/mysql/lib"
Windows の場合は、app-env="Path=c:/php/lib:c:/mysql/lib" になります。
app-env を使用して、ほかの環境変数を PHP アプリケーションにエクスポートすることもできます。 php.ini ファイルの場所は、app-env="PHPRC=<directory path>" のように指定できます。
PHP を使用する場合は、PHP_FCGI_CHILDREN および PHP_FCGI_MAX_REQUESTS により大きな値を指定して、FastCGI に対する PHP の構成時により高い優先順位を PHP に与える必要があります。
min-procs - (省略可能) 作成すべき FastCGI アプリケーションプロセスの最小数を指定する整数。デフォルトは 1 です。
max-procs - (省略可能) 同時に作成可能な FastCGI アプリケーションプロセスの最大数を指定する整数。この整数値は、min-procs と等しいかそれより大きくなければいけません。デフォルトは 1 です。
現在のところ、デフォルト値はパラメータとして使用できません。この問題については詳しくは、『Sun Java System Web Server 7.0 Update 3 リリースノート』の「FastCGI 」を参照してください。
reuse-connection - (省略可能) FastCGI アプリケーションへの接続が再利用されるかどうかを決定するブール値。False (0、false、no) は、要求が終了するたびに FastCGI アプリケーションへの接続が閉じられることを示します。True (1、true、yes) は、既存の接続が新しい要求で再利用されることを示します。デフォルトは false です。connection-timeout も参照してください。
connection-timeout - (省略可能) 「reuse-connection」が True に設定されている場合に、この値はプール内の接続のタイムアウト値を秒単位で指定します。この指定された期間の間、ある接続がアイドル状態になっていると、プラグインはその接続を閉じます。このパラメータのデフォルト値は 5 秒です。reuse-connection も参照してください。
resp-timeout - (省略可能) FastCGI サーバー応答タイムアウトを秒単位で表す整数。指定された期間の間、FastCGI アプリケーションから応答がなかった場合、その要求は破棄されます。このパラメータのデフォルト値は 5 分です。
restart-interval - (省略可能) FastCGI アプリケーションが次に再起動されるまでの時間間隔 (分) を表す整数。このパラメータのデフォルト値は 60 分 (1 時間) です。このパラメータの値をゼロに設定すると、FastCGI アプリケーションが強制的に再起動されることがなくなります。
req-retry - (省略可能) FastCGI アプリケーションが要求を拒否した場合にプラグインが要求を再送信すべき回数を表す整数。このパラメータのデフォルト値はゼロです。
listen-queue - (省略可能) ソケットの待機キューサイズを指定する整数。このパラメータのデフォルト値は 256 です。
rlimit_cpu — FastCGI プログラムの使用する CPU の最大時間 (秒) を指定します。指定できるのは、現在の (弱い) 制限値だけです。このパラメータに対して最大の (強い) 制限値は適用されずに、無視されます。
パラメータ chroot、user、group、nice 、chdir、rlimit_as、rlimit_core 、および rlimit_nofile は UNIX プラットフォームのみに適用されます。Windows プラットフォームでは、それらのパラメータは無視されます。
chroot - (省略可能、UNIX のみ) FastCGI サーバーアプリケーションプロセスの chroot を実行するときのルートディレクトリを設定するために使用されます。
user - (省略可能、UNIX のみ) FastCGI アプリケーション実行時に使用するユーザー ID を指定します。デフォルトは、Web Server のユーザー ID になります。
group - (省略可能、UNIX のみ) 指定されたグループの下で FastCGI アプリケーションが実行されます。デフォルトは、Web Server のグループになります。
nice - (省略可能、UNIX のみ) FastCGI アプリケーションプロセスの nice/priority 値を指定します。
chdir - (省略可能、UNIX のみ) 実行開始前に、chroot し chdir で移動するディレクトリを指定します。
rlimit_as - (省略可能、UNIX のみ) CGI プログラムのアドレス空間の最大値 (バイト) を指定します。現在の (弱い) 制限値と最大の (強い) 制限値の両方を、コンマで区切って指定できます。弱い制限値を最初に指定してください。制限値が 1 つだけ指定された場合は、両方の制限値がこの値に設定されます。
rlimit_core - (省略可能、UNIX のみ) CGI プログラムのコアファイルサイズの最大値を指定します。値 0 を指定すると、書き込みコアが無効になります。 現在の (弱い) 制限値と最大の (強い) 制限値の両方を、コンマで区切って指定できます。弱い制限値を最初に指定してください。制限値が 1 つだけ指定された場合は、両方の制限値がこの値に設定されます。
rlimit_nofile - (省略可能、UNIX のみ) CGI プログラムのファイル記述子の最大数を指定します。現在の (弱い) 制限値と最大の (強い) 制限値の両方を、コンマで区切って指定できます。弱い制限値を最初に指定してください。制限値が 1 つだけ指定された場合は、両方の制限値がこの値に設定されます。
error-fastcgi サーバーアプリケーション関数 (SAF) は次のパラメータを受け付けます。
error-url - 障害またはエラーが発生したときに表示するページの URI または URL を指定します。このパラメータの値は、絶対パス、ドキュメントルートからの相対パス、URL、URI のいずれかになります。
error-reason - (省略可能) FastCGI プロトコルのエラーを表す文字列。この文字列は、プラグインエラー発生時に表示するエラー URL を区別するために使用されます。
この節では、有効なすべての「error-reason」文字列とその説明の一覧を示します。
「Missing or Invalid Config Parameters」: app-path および bind-path が指定されていない。
「Stub Start Error」: Fastcgistub プロセスの起動に失敗した。
「Stub Connection Failure」: Fastcgistub に接続できない。
「No Permission」: FastCGI アプリケーションまたは Fastcgistub が実行権を持っていない。
「Stub Request Handling Error」: 要求をスタブに送信できない、スタブから要求に対する無効な応答を受信したり応答を受信しなかった、など。
「Set Parameter Failure」: ユーザー、グループ、ディレクトリ変更、優先順位などの設定に失敗した場合。
「Invalid user and/or group」: ユーザーまたはグループが無効である場合。
「Server Process Creation Failure」: FastCGI アプリケーションの実行に失敗したか、指定されたアドレスに FastCGI アプリケーションをバインドできない。
「Fastcgi Protocol Error」: 無効な FastCGI バージョンまたはロールを含むヘッダーが、FastCGI アプリケーションに含まれている。
「Internal Error」: フィルタアプリケーションに送信するファイルを開くことができない、あるいはその他の未知のエラーが発生した。
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 |
FastCGI 対応の PHP をリモートモードで実行して、Sun Java System Web Server を構成できます。これにより、Web Server がリモート PHP エンジンに要求を渡すことが可能になります。
FastCGI 対応の PHP を実行します。
$ php -b <hostname>:<port> & |
次に例を示します。
$ php -b localhost:4321 & |
使用している PHP が FastCGI に対応しているかどうかは、次のコマンドで確認できます。
$ php -v |
PHP 5.2.5 (cgi-fcgi) (built: May 8 2008 12:50:19) Copyright (c) 1997-2007 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies |
出力内で cgi-fcgi を検索して確認します。
CLI を使用して Sun Java System Web Server を構成します。
ここでは、test という名前の Web Server インスタンスが作成されるとします。
CLI を使用して、次のコマンドを実行します。
wadm> create-fastcgi-handler --config=test --vs=test --uri-pattern=/php/* --role=responder --bind-path="localhost:4321" wadm> deploy-config test |
レスポンダというロールを備えた FastCGI ハンドラが作成されます。
インスタンスを再起動します。
wadm> restart-instance --config=test localhost |
構成の完了後に、Web Server からの要求がリモート PHP エンジンに転送されているかどうかを確認できます。
この節には、PHP、Perl、および C を使って記述されたサンプル FastCGI アプリケーションが含まれています。
<?php $dir = "/tmp/"; // Open a known directory, and proceed to read its contents if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: $file : filetype: " . filetype($dir . $file) . "\n"; } closedir($dh); } } ?>
この例に対する obj.conf の一部を次に示します。
<Object name="default"> NameTrans fn="assign-name" from="/fcgi/*" name="responder.fcgi" </Object> <Object name="responder.fcgi"> Service fn="responder-fastcgi" app-path="/foo/fastcgi-enabled-php-installation/bin/php" bind-path="localhost:3431" min-procs=3 </Object>
#!/usr/bin/perl use FCGI; while (FCGI::accept >= 0) { if( $ENV{'HTTP_AUTHORIZATION'} ) { # This value can be further decoded to get the actual # username and password and then # perform some kind of user validation. This program only # checks for the presence of # of this environment param and is not really bothered about its value print( "Status: 200\r\n" ); print( "\r\n" ); } else { print( "Status: 401\r\n" ); print( "WWW-Authenticate: basic realm=\"foo\"\r\n" ); print( "\r\n" ); } }
この例に対する obj.conf の設定を次に示します。
<Object name="responder.fcgi"> AuthTrans fn="auth-fastcgi" app-path="/fastcgi/apps/auth/SimpleAuth.pl" bind-path="localhost:3432" Service fn="responder-fastcgi" app-path="/foo/fastcgi-enabled-php-installation/bin/php" bind-path="localhost:3433" app-env="PHP_FCGI_CHILDREN=8" min-procs=1 </Object>
http://localhost/fcgi/php/ListDir.php への要求が初めて発生すると、ブラウザによって認証ダイアログボックスが表示されます。ユーザー名とパスワードの入力が完了すると、「/tmp」ディレクトリの内容が一覧表示されます。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcgi_stdio.h> void main(void) { size_t PageSize = 1024 * 3; char *page; FCGX_Stream *in, *out, *err; FCGX_ParamArray envp; int count=0; page = (char *)malloc(PageSize); if (page == NULL) { printf("Content-type: text/x-server-parsed-html\r\n"); printf("<title>malloc failure</title>"); printf("<h1>Cannot allocate memory to run filter. exiting</h1>"); printf("\r\n\r\n"); exit(2); } while(FCGI_Accept() >= 0) { char *tmp; char *execcgi; char *dataLenStr = NULL; int numchars = 0; int stdinDataSize = 0; int filterDataLen = 0; int dataToBeRead = 0; int x = 0; int loopCount = 0; count++; dataLenStr = getenv("FCGI_DATA_LENGTH"); if(dataLenStr) filterDataLen = atoi(dataLenStr); /* clear out stdin */ while (EOF != getc(stdin)) { stdinDataSize++; } dataToBeRead = filterDataLen; FCGI_StartFilterData(); tmp = page; /** just in case fread or fwrite moves our pointer **/ //start responding printf("Content-type: text/plain\r\n"); printf("\r\n"); /** send a new line at the beginning **/ printf("<title>SIMPLE FILTER</title>"); printf(<h1>This page was Filtered by SimpleFilter FastCGI filter</h1>"); printf("file size=%d<br>", filterDatalen); printf("stdin size=%d<br>, stdinDataSize); while(dataToBeRead > 0 ) { x = 0; page = tmp; if(dataToBeRead > PageSize) x = PageSize; else x = dataToBeRead; numchars = fread((void *)(page), 1, x, stdin); if( numchars == 0 ) continue; /** at this point your data is in page pointer, so do whatever you want with it before sending it back to the server. In this example, no data is manipulated. Only the count of number of times the filter data is read and the total bytes read at the end of every loop is printed. **/ dataToBeRead -= numchars; loopCount++; printf("loop count = %d ... so far read %d bytes <br>", loopCount, (filterDatalen - dataToBeRead)); } printf("\r\n\r\n"); /** send a new line at the end of transfer **/ fflush(stdout); page = tmp; /** restore page pointer **/ memset(page,NULL,numchars); } free(page); }
この例に対する obj.conf の設定例を次に示します。
この FastCGI アプリケーションが、Web Server が稼働しているのと同じマシン上で利用可能になっている場合は、次のようにします。
<Object name=<"filter.fcgi"> Service fn="filter-fastcgi" app-path="/fastcgi/apps/filter/SimpleFilter.exe" bind-path="localhost:3434" app-env="LD_LIBRARY_PATH=/fastcgi/fcgi-2.4/libfcgi/.libs" </Object>
このアプリケーションがリモートマシン上で実行されている場合には、obj.conf ファイル内に次のコード行を含める必要があります。
<Object name="filter.fcgi"> Service fn="filter-fastcgi" bind-path="<remote-host>:<remote-port>" </Object>
Web Server インスタンスのドキュメントルートディレクトリの下にある fcgi ディレクトリに格納されたサイズ「26868」バイトの「FilterThisFile」が、フィルタリング対象のファイルである場合、「http://localhost/fcgi/filter/FilterThisFile」への要求によって次の出力が生成されます。
This page was Filtered by SimpleFilter FastCGI filter
file size = 26868 |
stdin size = 0 |
loop count = 1... so far read 3072 bytes |
loop count = 2... so far read 6144 bytes |
loop count = 3... so far read 9216 bytes |
loop count = 4... so far read 12288 bytes |
loop count = 5... so far read 15360 bytes |
loop count = 6... so far read 18432 bytes |
loop count = 7... so far read 21504 bytes |
loop count = 8... so far read 24576 bytes |
loop count = 9... so far read 26868 bytes |