FastCGI を使用した IIS 7 での PHP アプリケーションのホスト

公開日: 2007 年 12 月 5 日 (作業者: IIS チーム (英語))

更新日: 2009 年 6 月 26 日 (作業者: IIS チーム (英語))

この記事では、IIS 7 で PHP アプリケーションをホストできるように FastCGI モジュールおよび PHP を構成する方法について説明します。

Ff454027.warning-sign-small(ja-jp,TechNet.10).gif重要 : この記事では、Windows Server 2008 および Windows Vista SP1 上で FastCGI コンポーネントをインストールして使用する手順について説明します。Windows Vista に SP1 がインストールされていることが必須です。

目次

  • 概要
  • IIS 7 での FastCGI サポートの有効化
    • Windows Server 2008
    • Windows Vista SP1
    • FastCGI モジュールの更新プログラム
    • IIS 7 管理パック
  • PHP のインストールおよび構成
  • PHP 要求を処理するための IIS の構成
    • IIS マネージャーの使用
    • コマンド ラインの使用
  • FastCGI および PHP を構成するためのベスト プラクティス
    • セキュリティ分離
    • プロセスのリサイクル
    • PHP のバージョン管理
    • セキュリティに関する推奨事項
  • サイトごとの PHP 構成
  • PHP アプリケーション用の URL 書き換え
  • 関連情報

概要

IIS の FastCGI モジュールを使用すると、IIS Web サーバー上で、FastCGI プロトコルをサポートする一般的なアプリケーション フレームワークをホストして、優れたパフォーマンスと信頼性を実現できます。Common Gateway Interface (CGI) は、Web サーバーと外部アプリケーションの標準インターフェイスとして、IIS の初回リリース以来、機能セットの 1 つとしてサポートされてきましたが、FastCGI はこの CGI に代わる高性能な機能です。

CGI プログラムは、Web サーバーによって要求ごとに起動される実行可能ファイルであり、要求を処理して応答を動的に生成し、クライアントに送信します。こうしたフレームワークの多くはマルチスレッド実行をサポートしていないため、CGI ではプロセスごとに要求を 1 つのみ実行することにより、IIS でのフレームワークの安定性を確保しています。しかしその反面、要求ごとにプロセスの起動と終了を行うため、CGI のパフォーマンスは高くありません。

CGI のこうしたパフォーマンス上の問題に対して、FastCGI では 1 つのプロセスを多数の要求に対して繰り返し再利用することで対処しています。また、FastCGI では、再利用可能なプロセスのプールを装備し、各プロセスで一度に処理する要求の数を 1 つとすることで、非スレッド セーフなライブラリとの互換性を維持しています。

IIS 7 での FastCGI サポートの有効化

Windows Server 2008

[サーバー マネージャ]、[役割]、[役割サービスの追加] の順に移動して、CGI 役割サービスを追加します。これで、CGI サービスおよび FastCGI サービスの両方が有効になります。

Ff454027.246_IIS_Enable_FastCGI_Role(ja-jp,TechNet.10).png

Windows Vista SP1

[コントロール パネル]、[プログラムと機能]、[Windows の機能の有効化または無効化] の順に移動して、CGI 機能を追加します。これで、CGI サービスおよび FastCGI サービスの両方が有効になります。

Ff454027.246_CGI_in_Vista(ja-jp,TechNet.10).png

Ff454027.warning-sign-small(ja-jp,TechNet.10).gif 重要: FastCGI モジュールの更新プログラムのインストール

IIS 7 FastCGI モジュールの更新プログラムでは、一般的な PHP アプリケーションに関するいくつかの既知の互換性の問題が修正されています。以下のいずれかの場所から更新プログラムをインストールします。

IIS 7 管理パックのインストール

メモ: この手順はオプションです。

IIS 7 管理パックの役立つ機能として、FastCGI 設定を構成するのに便利なユーザー インターフェイスがあります。Administration Pack は、以下の場所からインストールできます。

PHP のインストールおよび構成

非スレッド セーフ ビルド版の PHP を IIS 7 FastCGI と組み合わせて使用することをお勧めします。非スレッド セーフ ビルド版の PHP では、FastCGI で保証されるシングル スレッド実行環境により、不要なスレッド セーフ チェックを行う必要がないので、標準のビルド版に比べパフォーマンスが大幅に向上します。

  1. http://www.php.net/downloads.php(英語) から、非スレッド セーフな ZIP パッケージと PHP のバイナリをダウンロードします。
  2. 選択したディレクトリ (例: C:\PHP) にファイルを展開します。php.ini-recommended を php.ini に名前を変更します。
  3. php.ini ファイルを開き、コメントを解除して次のように設定を変更します。
    • fastcgi.impersonate = 1 と設定します。IIS の FastCGI では、呼び出しクライアントのセキュリティ トークンを偽装する機能がサポートされています。これにより、要求が実行されるセキュリティ コンテキストを IIS で定義できます。

    • cgi.fix_pathinfo=1 と設定します。cgi.fix_pathinfo では、CGI への本来の PATH_INFO/PATH_TRANSLATED がサポートされています。従来の PHP の動作では、PATH_TRANSLATED を「SCRIPT_FILENAME」に設定し、PATH_INFO の定義については配慮していませんでした。PATH_INFO の詳細については、CGI の仕様を参照してください。PATH_INFO を 1 に設定すると、仕様に準拠するように PHP CGI のパスが修正されます。

    • cgi.force_redirect = 0 と設定します。

    • open_basedir に、Web サイトのコンテンツがあるフォルダーまたはネットワーク パスを設定します。

    • extension_dir に、PHP 拡張機能がある場所を設定します。通常、PHP 5.2.X の場合は、extension_dir = "./ext" と設定します。

    • 対応する行のコメントを解除して、必要な PHP 拡張機能を有効にします。例を以下に示します。

      extension=php_mssql.dll
      extension=php_mysql.dll

  4. PHP が正常にインストールされているかどうかをテストするには、コマンド ライン プロンプトで以下のコマンドを実行します。
C:\PHP>php -info

PHP が正しくインストールされ、PHP と依存関係にある機能をコンピューター上で使用できる場合は、このコマンドにより現在の PHP 構成情報が出力されます。

PHP 要求を処理するための IIS 7 の構成

IIS 7 で PHP アプリケーションをホストするには、FastCGI プロトコルを使用して PHP 固有のすべての要求を PHP アプリケーション フレームワークに渡すよう IIS に指示するハンドラー マッピングを追加する必要があります。

IIS マネージャーの使用

IIS マネージャーを開き、サーバー レベルで、[ハンドラー マッピング] を選択して開きます。

Ff454027.246_IIS_Add_Handler_Mapping(ja-jp,TechNet.10).png

[モジュール マップの追加] 操作を選択し、以下のように構成設定を指定します。

Ff454027.246_IIS_Add_0Module_Mapping(ja-jp,TechNet.10).png

  • [要求パス:] 「*.php
  • [モジュール:] 「FastCgiModule
  • [実行可能ファイル:] 「C:\[PHP インストール場所へのパス]\php-cgi.exe
  • [名前:] 「PHP via FastCGI

[OK] をクリックします。この実行可能ファイルの FastCGI アプリケーションを作成するかどうかを確認するダイアログ ボックスが表示されます。[はい] をクリックします。

Ff454027.246_file3(ja-jp,TechNet.10).jpg

C:\inetpub\wwwroot フォルダーで、以下のコードが含まれる phpinfo.php ファイルを作成し、ハンドラー マッピングが正しく機能していることをテストします。

<?php phpinfo(); ?>

ブラウザーを開き、https://localhost/phpinfo.php に移動します。すべてが正しくセットアップされていれば、以下のような標準の PHP 情報のページが表示されます。

Ff454027.246_phpinfo(ja-jp,TechNet.10).png

メモ: [モジュール:] ドロップダウン リストに [FastCgiModule] が表示されない場合は、モジュールが登録されていないか、有効になっていません。FastCGI モジュールが登録されているかどうかを確認するには、IIS 構成ファイルの %WINDIR%\windows\system32\config\applicationHost.config を開き、<globalModules> セクションに以下の行があることを確認します。

<add name="FastCgiModule" image="%windir%\System32\inetsrv\iisfcgi.dll" />

また、同じファイルで、FastCGI モジュールが <modules> セクションに追加されていることを確認します。

<add name="FastCgiModule" />

コマンド ラインの使用

別の方法として、上述した手順は、コマンド ライン ツールの appcmd を使用して完了することができます。

FastCGI アプリケーション プロセス プールを作成するには、以下のコマンドを実行します。

C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='c:\{php_folder}\php-cgi.exe']

続いて、ハンドラー マッピングを作成します。

C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /+[name='PHP_via_FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='c:\{php_folder}\php-cgi.exe',resourceType='Unspecified']

メモ: PHP バージョン 4.X を使用している場合は、php-cgi.exe の代わりに php.exe を使用できます。

FastCGI および PHP を構成するためのベスト プラクティス

このダウンロードには、共有ホスト環境で PHP をホストするためのベスト プラクティスに関するプレゼンテーションの概要が含まれています。

PHP Web サイトのセキュリティ分離

共有ホスト環境での PHP Web サイトの分離に関する推奨事項は、IIS 7 用の一般的なセキュリティ分離に関するすべての推奨事項と一貫しています。特に、以下の項目が推奨されています。

  • Web サイトごとに 1 つのアプリケーション プールを使用する
  • アプリケーション プールの ID として専用のユーザー アカウントを使用する
  • アプリケーション プール ID を使用するように匿名ユーザー ID を構成する
  • FastCGI 偽装が php.ini ファイルで有効になっている (fastcgi.impersonate=1) ことを確認する

共有ホスト環境でのセキュリティ分離に関する詳細については、アプリケーション プールを使用したサイトの分離 を参照してください。

PHP プロセス リサイクル動作

ネイティブ PHP リサイクルが開始される前に、FastCGI で php-cgi.exe プロセスが常にリサイクルされることを確認します。FastCGI プロセス リサイクル動作は、構成プロパティの instanceMaxRequests によって制御されます。このプロパティでは、リサイクルの前に FastCGI プロセスによって処理される要求の数が指定されます。また、PHP には環境変数の PHP_FCGI_MAX_REQUESTS によって制御される同じようなプロセス リサイクル機能があります。[instanceMaxRequests] の値を [PHP_FCGI_MAX_REQUESTS] の値よりも小さくするか、等しくなるように設定すると、ネイティブ PHP プロセス リサイクル ロジックが開始されないようにすることができます。

FastCGI 設定は IIS マネージャーを使用するか、コマンド ライン ツールの appcmd を使用して構成できます。

IIS マネージャーの使用

IIS マネージャーを使用して FastCGI リサイクル設定を構成するには、IIS 7 Administration Pack をインストールして、サーバー レベルで FastCGI 設定を選択する必要があります。

Ff454027.246FastCGI_settings(ja-jp,TechNet.10).png

次に、構成する FastCGI アプリケーションを選択して、右側の [操作] ウィンドウで [編集...] をクリックします。

Ff454027.246_EditFastCGISettings(ja-jp,TechNet.10).png

[FastCGI アプリケーションの編集] ダイアログで、[instanceMaxRequest] を「10000」に設定して、[EnvironmentVariables] 設定の隣にある参照ボタンをクリックします。

Ff454027.246_FastCGIAppSettings(ja-jp,TechNet.10).png

[PHP_FCGI_MAX_REQUESTS] 環境変数を追加して、その値を 10000 に設定します。

Ff454027.246_SetEnvVariable(ja-jp,TechNet.10).png

メモ: 上記の設定を構成しない場合は、次の既定の設定が使用されます。instanceMaxRequests = 200、PHP_FCGI_MAX_REQUESTS = 500 (ほとんどの PHP ビルド版の既定値)。

コマンド ラインの使用

appcmd を使用して、FastCGI および PHP のリサイクル動作を構成するには、以下のコマンドを使用します。

C:\>%windir%\system32\inetsrv\appcmd set config -section:system.webServer/fastCgi /[fullPath='c:\{php_folder}\php-cgi.exe'].instanceMaxRequests:10000

C:\>%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='C:\{php_folder}\php-cgi.exe'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000']"

PHP のバージョン管理

PHP アプリケーションの多くは、特定のバージョンの PHP でしか使用できない機能に依存している場合があります。そのようなアプリケーションが同じサーバー上でホストされる場合は、バージョンが異なる複数の PHP を同時に有効にして実行する必要があります。IIS 7 FastCGI ハンドラーでは、同じ Web サーバーでの複数バージョンの PHP の実行を完全にサポートしています。

たとえば、Web サーバー上で、非スレッド セーフな PHP 4.4.8、PHP 5.2.1、および PHP 5.2.5 をサポートする計画について想定します。これを実現するには、対応する PHP バイナリをファイル システム上の個別のフォルダー (たとえば、C:\php448\、C:\php521\、C:\php525nts) に置いてから、各バージョンの FastCGI アプリケーション プロセス プールを作成する必要があります。

C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='c:\php448\php.exe']

C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='c:\php521\php-cgi.exe']

C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='c:\php525nts\php-cgi.exe']

ここで、サイトごとに異なるバージョンの PHP を使用する必要がある 3 つの Web サイト (site1、site2、site3) がある場合、これらのサイトに対して個別に、対応する FastCGI アプリケーション プロセス プールを参照するようにハンドラー マッピングを定義できます。

メモ: 各 FastCGI プロセス プールは、fullPath プロパティと arguments プロパティの組み合わせにより一意に識別されます。

C:\>%windir%\system32\inetsrv\appcmd set config site1 -section:system.webServer/handlers /+'..[name='PHP448_via_FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='c:\php448\php.exe',resourceType='Either']

C:\>%windir%\system32\inetsrv\appcmd set config site2 -section:system.webServer/handlers /+'..[name='PHP521_via_FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='c:\php521\php-cgi.exe',resourceType='Either']

C:\>%windir%\system32\inetsrv\appcmd set config site3 -section:system.webServer/handlers /+'..[name='PHP525nts_via_FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='c:\php525nts\php-cgi.exe',resourceType='Either']

PHP セキュリティに関する推奨事項

以下の設定を使用して、PHP インストールのセキュリティを強化できます。推奨されている変更を加えるには、php.ini ファイルを見つけて開き、以下の説明にあるとおり構成設定を編集します。

設定 説明
allow_url_fopen = Off
allow_url_include = Off
ファイル処理機能のためのリモート URL を無効にします。これにより、コード インジェクションの脆弱性が生じる場合があります。
register_globals = Off register_globals を無効にします。
open_basedir = "c:\inetpub\" PHP プロセスが、ファイル システム上で読み込みおよび書き込みを実行できる場所を制限します。
safe_mode = Off
safe_mode_gid = Off
セーフ モードを無効にします。
max_execution_time = 30
max_input_time = 60
スクリプトの実行時間を制限します。
memory_limit = 16 M
upload_max_filesize = 2 M
post_max_size = 8 M
max_input_nesting_levels = 64
メモリ使用量およびファイル サイズを制限します。
display_errors = Off
log_errors = On
error_log = "C:\path\of\your\choice"
エラー メッセージおよびログを構成します。
fastcgi.logging = 0 FastCGI プロトコルを使用して、PHP から stderr 上にデータが送信されると、IIS FastCGI モジュールにより要求は失敗します。FastCGI ログを無効にすると、PHP から stderr 上にエラー情報が送信されなくなり、クライアントに対して 500 応答コードが生成されなくなります。
expose_php = Off PHP を非表示にします。

サイトごとの PHP 構成の有効化

このセクションでは、サイトごとに PHP 構成を有効にする方法に関する推奨事項について説明します。この推奨事項は、Radney Jasmin 氏が、GoDaddy.com (FastCGI を使用して Windows Server 2008 上で PHP ホストを提供するホスト プロバイダー) で確認および検証したものです。

サイトごとの PHP プロセス プール

Web サイトごとに独自のアプリケーション プールがある (IIS 7 の推奨事項) 場合は、専用の FastCGI プロセス プールを Web サイトごとに関連付けることができます。FastCGI プロセス プールは、fullPath 属性と arguments 属性の組み合わせにより一意に識別されます。そのため、同じプロセス実行可能ファイル (php-cgi.exe など) に対して複数の FastCGI プロセス プールを作成する必要がある場合は、arguments 属性を使用してプロセス プールの定義を区別できます。また、php-cgi.exe プロセスでは、コマンド ライン スイッチ "-d" を使用して、PHP プロセスの INI エントリを定義できます。このスイッチを使用して、引数文字列を一意な文字列にする PHP 設定を行うことができます。

たとえば、独自の PHP 設定セットが必要な "website1" と "website2" の 2 つの Web サイトがある場合は、FastCGI プロセス プールを以下のように定義できます。

<fastCgi>
    <application fullPath="C:\PHP\php-cgi.exe" arguments="-d open_basedir=C:\Websites\Website1" />
    <application fullPath="C:\PHP\php-cgi.exe" arguments="-d open_basedir=C:\Websites\Website2" />
</fastCgi>

この例では、PHP 設定の open_basedir を使用して、複数のプロセス プールの定義を区別しています。また、この設定により、対応する Web サイトのルート フォルダー内でのみ、プロセス プールごとの PHP 実行可能ファイルでファイル操作を実行できるようになります。

website1 の PHP ハンドラー マッピングは以下のようになります。

<system.webServer>
    <handlers accessPolicy="Read, Script">
        <add name="PHP via FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\PHP\php-cgi.exe|-d open_basedir=C:\Websites\Website1" resourceType="Unspecified" requireAccess="Script" />
    </handlers>
</system.webServer>

website2 の PHP ハンドラー マッピングは以下のようになります。

<system.webServer>
    <handlers accessPolicy="Read, Script">
        <add name="PHP via FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\PHP\php-cgi.exe|-d open_basedir=C:\Websites\Website2" resourceType="Unspecified" requireAccess="Script" />
    </handlers>
</system.webServer>

php.ini の場所の指定

PHP プロセスが起動すると、さまざまな設定を使用して、php.ini 構成ファイルの場所が特定されます。PHP 起動プロセスの詳細については、PHP マニュアル (英語) を参照してください。PHP プロセスによって php.ini の場所が検索される場所の 1 つに PHPRC 環境変数があります。PHP プロセスでは、この環境変数で指定されたパスに php.ini ファイルが見つかった場合は、そのファイルが使用されます。見つからなかった場合は、既定の php.ini の場所に戻ります。この環境変数を使用すると、ホスト ユーザーは独自のバージョンの php.ini ファイルを使用できます。

たとえば、website1 (ファイル パス: C:\WebSites\website1) と website2 (ファイル パス: C:\WebSites\website2) の 2 つの Web サイトがある場合は、applicationHost.config ファイルの <fastCgi> セクションで、php-cgi.exe プロセス プールを以下のように構成できます。

<fastCgi>
    <application fullPath="C:\PHP\php-cgi.exe" arguments="-d open_basedir=C:\Websites\Website1">
        <environmentVariables>
            <environmentVariable name="PHPRC" value="C:\WebSites\website1" />
        </environmentVariables>
    </application>
    <application fullPath="C:\PHP\php-cgi.exe" arguments="-d open_basedir=C:\WebSites\Website2">
        <environmentVariables>
            <environmentVariable name="PHPRC" value="C:\WebSites\website2" />
        </environmentVariables>
    </application>
</fastCgi>

このようにして、website1 は C:\WebSites\website1 の場所に独自のバージョンの php.ini を持ち、website2 は C:\WebSites\website2 の場所に独自のバージョンの php.ini を持つことできます。また、この構成により、PHPRC 環境変数で指定された場所に php.ini が見つからなかった場合、PHP は php-cgi.exe が格納されている場所と同じフォルダー内にある既定の php.ini ファイルを使用します。

PHP アプリケーション用の URL 書き換え機能の提供

一般的な PHP アプリケーションの大半は、Web サーバーの URL 書き換え機能に依存して、ユーザーと検索エンジンにとって使いやすい URL への書き換えを実現しています。IIS 7 には、URL 書き換えモジュールを使用した URL 書き換え機能があります。

URL 書き換えモジュールの使用方法の詳細については、以下の記事を参照してください。

Web Platform Installer による環境設定

本記事の原文が寄稿された時点では PHP を単独でインストールする方法しか無かったため、この記事で詳細な手順を公開していましたが、日本語情報として公開する現時点では日本語版の Web Platform Installer を利用することで容易に PHP 環境を Windows 上に構築できます。ただし、その時点でアプリケーション対応の多い PHP バージョンのみインストール可能なので複数バージョンを同じマシン上で実行する場合や詳細な設定をしたい場合には本記事の内容をご確認いただく必要があります。

Microsoft Web Platform Installer

関連情報

IIS での PHP アプリケーションのホストに関する詳細については、以下の情報を参照してください。

関連コンテンツ

記事

詳細情報

FastCGI 拡張機能の使用方法に関するご意見やバグの報告をお寄せいただく場合は、FastCGI フォーラムをご利用ください。

IIS での各種 PHP アプリケーションの実行に関する詳細については、次を参照してください。