今週は Open Source World にお邪魔します

Linux World には確か2年前にもお伺いしたんですが、その時は大きなステージの方は田辺で、私は小さいところで話しただけだったんです。いただいたご質問は ZoomIt と ASP.AJAX というちょっとIISとは関係ないものだったのですが、それはそれでうれしかったです。

今回はイベントの名前もOSSよりなものになっていますし、マイクロソフトOSS対応に関して色々とお話をさせていただくことになっています。

http://www.idg.co.jp/expo/osw/2009/outline/index.html

Window/IIS 上で PHP などを動かして何かメリットあるのかいな?

これは議論が多くありますよね。慣れてるのがいいという究極の一言を言ってしまうともちろんこれから書くことは全否定だと思いますが。(*^_^*)

PHPはどこで書いてますか?

PHP を使ったページ作りをしている人の多くは Windows 上でやっていると言われています。えっ?と思うかもしれませんが、Windows 2000Windows XPWindows ですから。ただここからが違うのですが、皆さんそういう環境に Apache を入れているんです。元々 OS についている IIS という同類の Web サーバーを捨てて、Apache を追加でインストールしているわけです。

こういう状況になったのにはもちろん原因があります。

それは 2002年ごろに話題になった IIS という Web サーバーへの攻撃による IIS の信頼性の失墜でした。CodeRed や Nimda を覚えている人は覚えているでしょう。Windows 2000 Server はインストールを行うと標準でIISがインストールされる、つまりメモ帳やコマンドプロンプトと同じように最初から動作するようになっていました。今 思うとなんでそんなことしたんだろうと本気で思うんですが、新種の攻撃というのがまだそれほど大きく取り上げられる前でした。

こうして「IIS は危険」というレッテルが貼られ、インターネットで使う人は激減したという歴史があるわけですね。なので、その後発行された PHP の学習書の多くは 「まず Apache をインストールします。」あるいは「何かしらの統合インストーラでxxします。」と書いてあるわけです。

PHPはどこで動かすのか?

今 多くの場合、Linux 上の Apache と答える人がインターネットであれば多いでしょう。しかし、イントラネットって Windows Server がいっぱいありませんか?そういう場合でも Windows 用の Apacheをサーバーにも入れるんでしょうか? はい と答える人が結構いるでしょうね。

そもそも IIS は嫌だとなった理由はなんでしたっけ?そもそも嫌いとか作っているところが嫌いとかは勘弁してください。ここから先 読む価値まったくないですからそういう人は。でももしシステムを納品する立場の方でお客様とそれで同意見であればいいですけど。。。

実は今 この不況の中、PHP/Linux で仕事をしている方が、PHP/Windows でも仕事を結構されています。そしてその多くはイントラネットにあります。イントラネットでは IIS も結構動いており、そこには ASPASP.NET が存在したり、他のアプリケーションプラットフォームやツールがいっぱい動いています。そういう環境に Apacheをインストールさせてもらえるでしょうか?厳しいこともあると思います。

なので、今の IIS を知っておくことは損にはならないと思います。

IIS 故のメリット

直球で言うと、IIS は現在は ASP.NET を動かす上で最高のぷラットーフォームです。メーカー一緒ですから当然ですよね。ASP からASP.NET へアプリケーション言語側が進化したとともに実はプラットフォームでもある IIS も進化をしました。特に IIS6 でのアプリケーションプールという考え方が大きい変化の一つです。

アプリケーションプールは 複数のアプリケーション(サイト)をどのプロセス上で動かしますか?という設定の考え方です。

IIS 上 で PHP をどう動かすのがいいのか

この点は多くの方によくご質問をいただくので早速書いておこうと思うのですが、基本的に下記の英語記事に基づいています。

http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis-70/

○サーバー側のPHP処理方式

インターネットを検索すると昔からあるのが IIS=ISAPIで設定 というものです。最新の情報という意味では Zend社 との協業によってIIS の開発チームのお薦めは FastCGI です。チューニングも FastCGI を前提に行っています。

詳細は無償冊子である私のチームで発行している IT交差点 のオレンジ色の号で書いたりもしました。
http://www.microsoft.com/japan/powerpro/magazine/vol5/bn.mspx

※PDFもここで入手できます。

※この冊子は色々な展示会やイベントで配布しているほか、まとまった数を団体でお申し込みいただけるようにもなっています。
http://www.microsoft.com/japan/powerpro/magazine/default.mspx
無料定期配布サービスというやつです。

要は、下記を知っていることが大事だと思います。

*ISAPI動作の複雑さ

Windowsはプロセスで処理の多重化を行っているのではなくて構造上プロセス内のスレッドが複数立ち上がることで行っているために、元々Windows用に設計する場合にマルチスレッド(スレッドが複数ある)を想定したランタイムや拡張のプログラム設計が必要となります。例えばここで議論になっているPHPのランタイムはもちろん歴史とともにスレッドセーフなものと考慮していないものの両方が入手可能になっています。なんで複数の種類があるのか悩んだ人もいると思います。ISAPIという方式はPHPアプリが動作する場合にインプロセスで動くために構造上だけで判断すると最速なので皆さんこちらを選んでいたことが多かったのだと認識しています。ただ、逆に利用するすべての拡張ライブラリに至るまでスレッドセーフ設計になっている必要があり、そうでない場合に問題を引き起こすことが多かったのです。なので、PHPIISで動作させるサポートへの問合せはこのパターンが多かったと聞いています。PHPのランタイム自身はスレッドセーフなものが用意されていても、拡張ライブラリの開発はIISを提供しているマイクロソフトが行っているのではないため、IISの開発チームにとっては悩ましい状況でした。

CGIの遅さ

CGIという方式は昔からあるもので、要求が Web サーバーに届いた際にプロセスを1個起動してそこでアプリケーション処理を行い、HTMLを生成、クライアントに送付後、プロセスを終了するという動きをします。この場合には要求に対して1プロセス起動するわけですから複数の要求が1プロセス内で処理されることが無いため、スレッドセーフでなくてもいいことになります。その代わりその代償は大きく、プロセスを起動するというパフォーマンス上 コストの高い処理を要求ごとに行うためにパフォーマンス面では不利でした。

*だからFastCGI

FastCGIの方式も実はもうだいぶ歴史が長い話なんだとは思います。ただ、上記の二つの課題を解決するいいとこどりができる構造であると判断した IIS の開発チームは IIS上で動作する FastCGI モジュールの開発に取り組み、現在 IIS5〜最新のIIS7まで揃えました。Windows Server 2008 からは標準搭載となり、CGIを入れると一緒にFastCGI も入るようになっています。FastCGI は要するに プロセスプール機能つきの CGI なんだと思います。なので、以前に起動されたプロセスを再利用するのでパフォーマンスコストを払うことなく、かつ スレッドセーフ考慮が必要ないため、安定して動作するということになります。

最初にご紹介した記事ではその原理に則って設定をしています。PHPのランタイムは(そろそろ Zend Core と言い始めようかと思いますが )バージョン更新を経て IIS の場合には FastCGI を使うという選択肢がインストーラーのものでも提供されるようになっているので手動解凍しなくてもよくなってきています。

IISってASPとASP.NETだけのもの?!

昔はそうでしたかね。でも今はだいぶ状況が変わってきています。もちろんMSテクノロジーで固めるといいことはいっぱいあるんですが、WindowsIISの上ではOSSを使うというのが米国では結構行なわれるようになってきています。

このきっかけはもちろんPHPエコシステムの質と量が多くの方に利用されていることから来ていると思いますが、マイクロソフトもまあIIS上でPHPがうまく動作できるようにしようよ、じゃあ ということにようやくなって、Zendさんと組んでPHPのランタイムのWindows環境でのチューニングに取り組んでいます。

http://www.php.net/windows
http://windows.php.net/qa/

とかを見ると新しい開発環境で開発したビルドが入っているのがわかりますが、これはチューニングを向上させていることの一躍を担っていますし、ここに協業が生きてきています。

IISの開発チームが発信している情報は基本 http://iis.net になりますけれども PHPRuby などの IIS 動作環境に関して発信しているのは Ruslan という人になるので彼のブログを紹介しておきましょう。

http://blogs.iis.net/ruslany/

なお、私の方で取り組んでいるこうした情報の日本語化は下記のサイトに集約していっていますので気がつかれた時にご訪問いただくと結構新しくなっているタイミングがあると思います。

http://technet.microsoft.com/iis

あまりご存知でない方のために書いておくとマイクロソフトのオンラインサイトには下記の大きな分類があります。例示として IIS で URL を書いておきます。

○製品ページ(製品概要、エディション違い、機能解説など)
http://www.microsoft.com/japan/windowsserver2008/prodinfo/r2/web-platform.mspx
IIS は OS の役割の一つで個別に入手するものではないのでちょっと階層が深くなってます。

○インフラ系の技術情報 - TechNet(テックネットと読みます)
http://technet.microsoft.com/iis
TechCenterというのは各製品あるいはテクノロジーのポータルページになっていて、IIS の TechCenter というのは日本独自のもので、米国は IIS.NET に集約されています。

○開発系の技術情報 - MSDN(エムエスディーエヌと読みます)
http://msdn.microsoft.com
開発系の情報なのであまりIIS本体の話はなくてMSの技術で言うとASP.NETとかになるのでそういう開発者向けの情報がここにあります。

これだけでも結構あるわけですが、これ以外にサポート技術情報(http://support.microsoft.com)IISであれば PHP on IIShttp://www.microsoft.com/japan/opensource/php/default.mspx)などもあります。ちなみにサポート技術情報は製品ごとにTechCenterのサポートタブからもアクセスできるように最近はなっています。

こんな整理みたことないのでお役にたてば幸いです。(*^_^*)