特集 Windows Server 2003完全ガイド
アーキテクチャを一新した新世代アプリケーション・サーバ

4.そのほかの機能

田口 景介
2003/03/19

ASP.NET

 大規模な改修を受け、大幅に安定性とスケーラビリティを向上させたとされるIIS 6.0だが、そのほとんどがWebアプリケーション/Webサービスのホスティングを目的としているといっても過言ではない。そのWebアプリケーションのプラットフォームとして、IIS 6.0とともに提供されるのがASP.NETである。ASP.NETは、名前が示すとおり、.NETをベースに構築されたASPの後継となるプラットフォームだが、コードとページ・デザインの分離、ユーザー・インターフェイスのコンポーネント化、イベント駆動モデルなど、ASPにはないはるかに洗練された特徴を数多く備えている(ASP.NETの詳細については別稿「Insider.NET:プログラミングASP.NET」を参照)。

 Windows Server 2003は、そのASP.NETが初めて標準搭載されるWindowsとなるわけだが、ご存じのとおりWindows 2000/XPにも.NET Frameworkをインストールすれば同等の環境を構築できるので、Windows Server 2003によって.NETの世界が何か大きく変わるというわけではない。あえていえば、現在はまだベータテスト中の.NET Framework 1.1が標準搭載されるところが新しいと言えなくもないが、追ってWindows 2000/XP向けのパッケージも提供されるので、標準搭載ということ自体に重大な意味はない。

 ただ、ASP.NETに限っていえば、IIS 6.0との組み合わせでのみ機能する新しいプロセス・モデルやセキュリティ・モデルが利用できるのは魅力的だ。詳しくはすでに解説したとおりだが、IIS 6.0にはワーカー・プロセス分離モードと呼ばれるプロセス・モデルが実装されており、各プロセスの独立性を高めることでアプリケーションの安定性が大きく向上している。今後ASP.NETアプリケーションを開発する予定があるなら、早めにIIS 6.0の評価を始めることをお勧めする。

 また、これは.NET Framework 1.1の機能だが、Windows Server 2003+ASP.NETの環境では、これまで別パッケージで配布されていたMobile Internet Toolkitが標準で組み込まれる(Mobile Internet Toolkitは、後に正式名称がASP.NET Mobile Controlとなった)。これは、PDAや携帯電話のようなプア・クライアントをターゲットにしたWebアプリケーションの開発を支援する、ASP.NETの拡張パッケージだ。これを利用すると、狭い画面と狭い通信帯域を有効に利用すべく、1ページに複数のフォームをレイアウトする仕組みや、デバイスに応じて適切なマークアップ言語のページ(cHTMLやHDML、WAPなど)が自動的に生成される機能が利用できる。

ASP.NET Mobile Control
.NET Framework 1.1から標準サポートとなるASP.NET Mobile Control(旧称Mobile Internet Toolkit)を利用すると、同一のASP.NETページから、HTMLだけでなく、cHTMLやHDMLといったモバイル・デバイス用言語でマークアップされたページが生成可能になる。

 ところで、.NET時代のプラットフォームを支えるアプリケーション・サーバとして登場するIISだが、土台となるIISと、その上に載るASP.NETでは、どちらがより重要視されているのだろうか。恐らく答えはASP.NETだ。もしApacheを倒してIISをNo.1のWebサーバ(アプリケーション・サーバ)にしたいのであれば、IISとASP.NETを不可分の関係にしていたはずだ。しかし、そうはなっていない。当初からWebサーバとASP.NETを結ぶインターフェイス仕様が公開されていたことから予想はされていたが、早くもApache上で動作するASP.NETが実現されているほか、ASP.NETに対応するオリジナルWebサーバも開発されている。これは、たとえIISが思うようにシェアを広げられなかったとしても、ASP.NETだけは、というよりも.NETだけは、是が非でも成功させたいと考えている証拠だ。どうやら、IISが.NETの普及を阻むアキレスけんになることはなさそうだ。

ASPディスクキャッシュ

 ASP.NETの登場によって、いまや一世代前のWebアプリケーション・プラットフォームとなってしまったASPだが、IIS 6.0ではすっかり過去のものになってしまったかといえばそうではない。IIS 6.0では、ASPディスク・キャッシュと呼ばれる機能によって、ASPの処理速度の向上が図られている。

 ソース・ファイルがあらかじめコンパイルされており、実行時にはバイナリ形式の実行ファイルが実行されるASP.NETに比べて、テキスト形式のスクリプトが解釈されながら実行されるインタプリタ・システムであるASPは、処理速度に不利な点が多いが、IIS 6.0では、ASPページをある程度前処理した状態をテンプレートとしてキャッシュすることで、実行時の負担を低減させる仕組みが組み込まれている。このテンプレートは一定数までメモリ上に保存されるが、それ以上のページがアクセスされる場合には(デフォルトでは500に設定されている)、ディスク上に保存しておくことも可能だ。

ASPディスク・キャッシュの設定
[Webサイト]の[プロパティ]で、ASPディスク・キャッシュの機能を制御することができる(このキャッシュ設定はWebサーバ全体で共通に設定される)。ASPディスク・キャッシュとは、1度実行されたASPページを「ASPテンプレート」と呼ばれる前処理された状態でメモリ上またはディスク上にキャッシュする機能であり、2回目以降の実行では、キャッシュしたデータを使うことで処理速度の向上を図ることができる。
  ASPファイルを(サーバ側でもクライアント側でも)キャッシュしない。
  ASPファイルをASPテンプレートに変換して、メモリ上にキャッシュする。
  ASPファイルをASPテンプレートに変換して、メモリおよびディスク上にキャッシュする。
  メモリに入らない分をディスク上にキャッシュする。
  ディスク上にキャッシュする数を制限する。
  キャッシュに使うディスク上のフォルダ。
  メモリ上にキャッシュするスクリプト・エンジン(スクリプトを処理するルーチン)の数。

 ただし、前処理が行われた状態とはいっても、x86ネイティブ・コードが生成されたり、.NETアセンブリが生成されたりするわけではなく、スクリプト・コードとHTMLコードの分離や文字コードの変換など、比較的単純な処理だけが行われた状態でキャッシュされるため、過大な期待はしない方がいいだろう。

……(略)……
cfg_datasource="d:\\winapps\\webapps\\Bookmark\\bookmark.mdb";
Response.WriteBlock(0)
……(略)……
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=x-sjis">
<link type="text/css" href="viewTree.css" rel="STYLESHEET">
<script language="JavaScript" src="viewTree.js"></script>
……(略)……
ASPテンプレート
通常、ASPページはページ・デザインとスクリプトが混在して記述されているが、これが分離されるなどの前処理が行われてから、キャッシュとして保存される。これは前処理が行われた後の(ディスクに保存された)スクリプト・ファイルの一部。実際には、先頭の方にはバイナリのコードが入っているし、またASPファイル中のスクリプト呼び出しの部分のコードもバイナリに翻訳・変換されている。

非同期CGI

 IISでは、リクエストに応じてスレッドが複数生成されるが、その数は基本的に最大256個に制限されている。スレッド数に上限が定められているということは、並列して処理できるリクエスト数に上限があるということだ。リクエストがスタティックなWebページを要求するものであれば、短時間で処理できるのでそれでも影響は少ないが、CGIスクリプトやASPページなど、処理に時間がかかるページへのリクエストが集中すると、リクエストを待つ空きスレッドが足りなくなり、Webサーバのレスポンスが低下してしまう。そこで、IIS 6.0には、IIS内部でリクエストを受け付けるスレッドと、CGIやASPを処理するスレッドを分離し、非同期に動作させる仕組みが用意されている。この仕組みによって、ISAPIエクステンションの処理がIISのスレッドをブロックしないで済むようになり、結果としてレスポンスの低下を防ぐことができる。

 この「非同期CGI」として解説されている機能は、IIS SDKによればISAPI 3.0から登場した「非同期I/O処理」と呼ばれており、実際にはCGIの処理でなくとも機能する。ただし、非同期に処理するには、ISAPIエクステンション(IISの拡張モジュール)が非同期CGIをサポートするように実装されていなければならないので、IIS 6.0に移行しただけで、既存のISAPIエクステンションが無条件で非同期化されるわけではない。非同期CGIに対応するには、ISAPIエクステンション内部で独自にスレッド・プールが管理され、非同期インターフェイスが実装されていなければならない。なお、IIS 6.0付属のISAPIエクステンションの中では、ASP(asp.dll)が非同期CGI対応であるとされている。

FTPユーザー分離モード

 あまりポピュラーな機能ではないが、Windows 2000/XPに付属するFTPサーバ(IIS 5.x)には、ftproot(FTPでログオンした直後にカレントとなっているフォルダのこと。デフォルトでは「c:\inetpub\ftproot」)にユーザー名と同名のフォルダを作成しておくと、ログイン時にそのフォルダが初期カレント・フォルダになるという機能がある。例えば「c:\inetpub\ftproot\user01」というフォルダを作成しておくと、user01がログオンした場合に、カレント・フォルダが「/」ではなく、「/user01」となるのである。UNIX上のFTPサーバなどとの互換性を考慮した機能のようだが、ログイン直後にフォルダを移動するだけの単純な機能であり、それ以上の意味は持っていない。「cd /」とするとルート・フォルダへ移動できてしまうし、アクセス権さえあればほかのユーザーのフォルダへも移動できてしまう。そのため、ユーザー・ファイルの保護には役に立たず、初心者ユーザー向けのちょっとした配慮という程度の機能である。結局、複数のユーザーが利用するFTPサーバでは、各ユーザー・フォルダごとに適切なアクセス権の設定などを行う必要があったわけだ。

 以下は、IIS 5.0のFTPサーバの使用例である。ユーザーuser01でログオンすると、カレント・フォルダが/user01となっていることが分かる。しかしcdコマンドでルートやほかのユーザーのフォルダへ移動することができる。

C:\>ftp server01
Connected to server01.
220 SERVER01 Microsoft FTP Service (Version 5.0).
User (server01:(none)): user01
331 Password required for user01.
Password:
230-Default FTP Site
230 User user01 logged in.
ftp> pwd
257 "/user01" is current directory. ……現在のフォルダ
ftp> cd /user02 ……ほかのユーザーのフォルダへ移動する
250 CWD command successful.
ftp> pwd
257 "/user02" is current directory.……移動している
ftp>
従来のIIS5.0におけるFTPの例

 IIS 6.0では、この機能を一歩進めた「FTPユーザー分離モード」と呼ばれるモードが追加され、より安全に運用できる環境が用意されている。FTPユーザー分離モードを指定すると、ログイン時にホーム・ディレクトリ(「ftproot/LocalUser/<ユーザー名>」として作成する)へと自動的に移動するようになるのは同じだが、このモードではそこから「cd ..」として親フォルダに移動することはできない。ホーム・ディレクトリが仮想的なルート・ディレクトリとなってしまうため、ほかのユーザーのディレクトリにはアクセスできなくなるという仕組みだ。こうしておけば、ほかのユーザーからファイルを読み書きされる心配はない。なおこのモードを設定しても、仮想ディレクトリには誰でもアクセスできるので、公開しておきたいパブリックなフォルダは、仮想ディレクトリとして設定しておけばよい。ただし、ディレクトリを一覧表示させても仮想ディレクトリは表示されないという、以前からの仕様はそのままなので、あまり使い勝手のよいものではない。

 FTPユーザー分離モードを利用するには、FTPサイトを作成するときにオプションを指定する。これ以外の方法でこのモードを設定することはできず、またその後無効にすることもできない。最初に作成されている既定のFTPサイトは通常モードとして作成されているので、新規にFTPサイトを作成しなければ利用できない。

FTPユーザー分離モードの作成
FTPサイト作成ウィザードを起動すると、FTPの各ユーザーを完全に分離して扱うかどうかを選択することができる。「FTPユーザー分離モード」ではログインしたユーザーに応じて、FTPルート・フォルダが切り替わり、ほかのユーザーからの読み書きを防いでファイルを保護する。モードをサイト作成後に変更することはできない。
  ユーザーごとのフォルダを分離しないモード。従来のFTPサーバと同じモード。
  ユーザーごとのフォルダを分離するモード。従来のFTPサーバと同じモード。
  Active Directoryに登録されているユーザーに基づいたユーザー分離モード。

 以下は、IIS 6.0のFTPサーバの使用例である。ユーザーuser01でログオンすると、カレント・フォルダはすでにルート(/)となっており、ほかのフォルダへ移動することはできない。ただし仮想ディレクトリ(/root)へは移動することができる。End of Article

C:\>ftp server2003
Connected to server2003.
220 Microsoft FTP Service
User (server2003:(none)): user01
331 Password required for user01.
Password:
230 User user01 logged in.
ftp> pwd. ……現在のフォルダ
257 "/" is current directory.. ……すでにルートになっている
ftp> cd /user02 ……ほかのユーザー・フォルダへの移動
550 /user02: The system cannot find the file specified. ……エラー
ftp> dir
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
-rwxrwxrwx   1 owner    group            1093 Mar 17 22:28 user01.txt
226 Transfer complete.……ファイルが1つだけある状態
ftp: 71 bytes received in 0.00Seconds 71000.00Kbytes/sec.
ftp> cd /root ……仮想ディレクトリへ移動
250 CWD command successful.
ftp> pwd
257 "/root" is current directory.
IIS 6.0におけるFTPの例

 

 INDEX
  [特集]Windows .NET Server 2003完全ガイド
  IIS 6.0の機能の詳細
     1.信頼性を向上させるアプリケーション・プール
     2.動作状態の監視とセキュリティ機能
     3.IIS 6.0の管理
   4.そのほかの機能

目次ページへ  Windows Server 2003完全ガイド


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間