IIS7.5 で PHP を使用する方法

先日、同僚が IIS7.5 (Windows 7) への PHP 5.3  のインストールがうまくいかない、とのことでお手伝いしました。

同僚は php.net からダウンロードした msi を使用してインストールを行っていたのですが、なんと、最近の PHP インストーラーには IIS 用の Fast CGI の設定が含まれているのですね。IIS 用のインストーラーで設定可能なのは ISAPI と、ふつーの CGI だけだと思っていたのですが、時代は進んでいるようです。

インストーラーの終了後、念のために IIS の設定を確認すると、正しくハンドラーマッピングの設定がされておりました。

PHP のランタイムのインストール場所は、同僚が変更していたので、デフォルトでどこになるかは不明ですが、セットアップ後に PHP ランタイムがコピーされたフォルダのアクセス権を確認すると、ワーカープロセスが使用するアカウントへのアクセス権は設定されていないので、これは別途手動で行う必要がありそうです。

さて、IIS7.5 では、このアクセス権の設定にコツがあります、というか、注意すべき点があります。

それはアプリケーションプールの動作アカウントです。

IIS7. 5 ではアプリケーションプールの既定の動作アカウントを ApplicationPoolIdentity という特殊なアカウントが使用されます。

この ApplicationPoolIdentity は仮想アカウントであり、アプリケーションが動作する際には、そのアプリケーションプールと同じ名前のアカウントが生成されて、そのアカウントを使用してアプリケーションプールが動作します。

たとえば、アプリケーションプールの名前が DefaultAppPool の場合は、DefaultAppPool という名前のアカウントで動作します。これは、複数のアプリケーションプールのプロセスが、同じ名前のアカウントで動作するセキュリティ的なリスクへの対応を強化するためのものです。

 

しかし、これらはあくまでも仮想アカウントであるため、ディスクやデータベースへのアクセス権の設定には、まだ(2009 年 10 月現在) 使用することができません。

よって、これらのリソースにアプリケーションプールの動作アカウントでアクセスする必要がある場合には、従来の NetworkService アカウントを使用するなどの工夫が必要になります。

今回の PHP のインストールでは、個別に NetworkService アカウントで動作するアプリケーションを作成してそれを使うようにし、PHP のランタイムのフォルダには NetworkService アカウントへの読み取りのアクセス権を設定しました。

※なんと、解決方法がありました。

ApplicationPoolIdentity で設定された仮想 ID は、それそのものを使用してアクセス権の設定を行うことはできませんが、ビルトインセキュリティグループの IIS_IUSRS に対してアクセス権を設定することにより仮想 ID を使用することが可能になります。

ただし、この方法はセキュリティグループでの設定が必要となりますので、SQL Server のアクセス権設定には使用できません。

ちなみに、Web サイトに .NET 認証の設定をする際にも、このような処理を行い、SQL Server のログオンアカウントに、使用するアプリケーションプールの動作アカウントを追加する必要があります。

さて、設定が完了し、動作させてみると HTTP 500 エラーが返り、PHP が正しく動作しません。

php.ini の内容を変更し、HTTP 500 は回避できたものの、今度は phpinfo() 関数が正しくない、と言ったエラーが発生します。

仕方がないので、念のために PHP のランタイムをアンインストールしてもらい、今度はいつもやっているとおり msi でなく、zip 形式でパッケージをダウンロードして手動で設定を行ったところすんなりと php.info() 関数が動作するようになりました。

このインストーラーと、手動での設定方式の違いについてなのですが、IIS の設定については、とくに違いがあるようには見えませんでした。

PHP 側の設定が、インストーラー (msi) と、手動で行うのでは違いがあるのかも知れませんが、残念ながら私は PHP に詳しくないので相違点があるのか or ないのか? それはどこなのか? というところは不明です。

というわけで、個人的には PHP 5.3 のインストールは手動で行うことをお勧めします。その際には IIS のアプリケーションプールの動作アカウントを OS 側で使用可能なものとし、そのアカウントに対し、PHP ランタイムのあるフォルダで [読み取り] のアクセス権を付与してください。

それから PHP のランタイムなのですが、IIS で使用するからといって Thread Safe モデルを選択する必要はもうありません。IIS 上の FastGCI モジュールはプロセスモードで動作するため、処理効率の良い Non-Thread Safe モデルのランタイムを使用することができます。

PHP も設定も、慣れてしまえば簡単なので、ぜひ IIS 上で PHP を動かせてみてください。

Real Time Analytics

Clicky