2005-05-14

Apache Windows版の基本設定

Apacheのメインの設定ファイルはhttpd.confです。httpd.conf はUNIX版とWindows版で記述方法や基本的な設定内容は同じです。尚、Apache 1.3とApache 2.0のhttpd.conf には完全な互換性がありませんので注意して下さい。httpd.conf は、テキストファイルなので、「メモ帳」などのテキストエディターで編集できます。編集後はApacheを再起動して下さい。

Apacheの基本構造

set01.gif

Apacheを設定する前に少しApacheについて復習しておきましょう。まず、基本的なApacheの構造です。Apache の前身はNCSAが開発したWeb サーバである NCSA httpdです。従って 、構造や設定などは NCSA httpd を基本としたものになっています。

簡単に説明するとApache は右図のような構造となっています。システムの核(コア)となるモジュールと、機能別のモジュールから構成されています。Apache では NCSA httpd の基本構造を踏襲しつつ、徹底的な機能のモジュール化により、様々な拡張が行われてきました。サーバの管理者は必要とするモジュールを選択し、サーバに組み込んで機能拡張をする事ができます。

NCSA(米国立スーパーコンピュータ応用研究所):
世界初のCGIによるWebブラウザ Mosaicを開発した組織として有名。Mosaic開発チームは、その後、Silicon Graphics社の創業者Jim Clark氏とNetscape Communications社を設立した。

インストール直後にhttpd.conf でロード指定があるモジュールを挙げておきます。

mod_accessクライアントリクエストに基づいたアクセス制御
mod_actionsメディアタイプやリクエストメソッドに応じてCGIスクリプトを実行する機能
mod_aliasホストファイルシステム上のいろいろな違う場所をドキュメントツリーにマップする機能と、URL のリダイレクトを行なう
mod_asis自分用のHTTPヘッダの書かれているファイルを送信する機能
mod_authテキストファイルによるユーザ認証
mod_autoindexディレクトリインデックスを生成する機能
mod_cgiCGIスクリプトの実行
mod_dir「最後のスラッシュ」のリダイレクトと、ディレクトリのインデックスファイルを扱う機能
mod_envCGIスクリプト及びSSI ページに渡される環境変数を変更する機能
mod_imapサーバサイドのイメージマップを処理する機能
mod_includeサーバがパースするhtmlドキュメント(SSI:Server Side Includes)
mod_isapiApache Windows版のためのISAPIエクステンション
mod_log_configサーバへのリクエストのロギング
mod_mimeリクエストされたファイルの拡張子と、ファイルの振る舞い(ハンドラとフィルタ)及び内容 (MIMEタイプ、言語、文字セット、エンコーディング)とを関連付ける機能
mod_negotiationコンテントネゴシエーション機能
mod_setenvifリクエストの特徴に基づいた環境変数の設定を可能にする機能
mod_userdirユーザ専用のディレクトリを提供する機能


ディレクティブ

Apacheの設定は「ディレクティブ」を設定ファイルhttpd.confに記述する事により行います。Apacheは起動時にのみhttpd.confの変更を認識します。ApacheはMIMEドキュメントタイプを含んでいるファイルも読み込みます。このファイル名は TypesConfigディレクティブで設定され、デフォルトではconf/mime.typesになっています。

httpd.confの各ディレクティブはいろいろなモジュールに作用します。Apacheのコアモジュールには基本的な機能だけが含まれ、その他の拡張機能はモジュールとして利用可能です。サーバが動的ロードモジュールを使うようにコンパイルされている場合、モジュールを別にコンパイルして、いつでもLoadModuleディレクティブを使って追加できます。設定ディレクティブは<IfModule>ブロックに入れることで特定のモジュールが存在するときだけhttpd.confに含まれるようにすることができます。

ディレクティブの適用範囲

httpd.confにあるディレクティブはサーバ全体に適用されます。サーバの一部分の設定だけを変更したい場合は <Directory>、<Files>、<Location>ブロックの中にディレクティブを記述します。これらの記述はXMLに似ており<Block>・・・</Block>と書きます。

<Directory Target>・・・</Directory >ホストファイルシステムの特定のディレクトリ(Target)に適用
<Files Target>・・・</Files >ホストファイルシステムの特定のファイル(Target)に適用
<Location Target>・・・</Location>特定のURLパス(Target)に適用

上記のTargetにはワイルドカードが使用できます。"*"は任意の文字列にマッチし、"?"は任意の1文字にマッチし、"[abc]"は abc の任意の文字にマッチします。 但し、"/"はどのワイルドカードにもマッチしないので、明示的に指定する必要があります。(Perl5互換の)正規表現によるマッチングを望む場合は、<Directory ~ Target>、 <Files ~ Target>、<Location ~ Target> と記述します。 <Directory ~ Target>の代わりに<DirectoryMatch Target> と書く事もできます。同様に <FileMatch Target>、<LocationMatch Target>と書くこともできます。

<Directory>と<Files>を両方使ってより詳細な設定を行う事ができます。

例:

<Directory "C:/Documents and Settings/*/My Documents/My Website">
 <Files index.html>
  Order allow,deny
  Deny from all
 </Files>
</Directory> 

Apacheは同時に多くの違うウェブサイトを扱う能力があります。これは バーチャルホストと呼ばれています。 特定のウェブサイトにのみ適用されるようにするために、ディレクティブは<VirtualHost>ブロックの中に置くことでも適用範囲を変えることができます。

アクセス制御ファイル ( .htaccess )

Apacheでは公開用のドキュメントツリー中に置かれた特別なファイルを使ってhttpd.confの設定内容の一部を上書きする事ができます。そのファイルはアクセス制御ファイルと呼ばれ、デフォルトでは.htaccessという名前ですが、AccessFileNameディレクティブを使って変更する事もできます。また、AllowOverrideディレクティブを使って、.htaccessによる設定の上書きを制御することもできます。 .htaccess中のディレクティブはこのファイルを置いたディレクトリと全てのサブディレクトリに適用されます。.htaccess はクライアントからのリクエスト時で読み込まれるので、変更はすぐに反映されます。

.htaccessの例(基本認証):

AuthType Basic               ユーザ認証を基本認証に指定
AuthName "Password Required"        ブラウザのユーザ認証ダイアログに表示するメッセージ
AuthUserFile /www/passwords/password.file ユーザ/パスワードの格納されたテキストファイル名
AuthGroupFile /www/passwords/group.file  ユーザグループの格納されたテキストファイル名
Require Group admins            認証後にアクセスを許可するグループの指定

ドキュメントディレクトリのマッピング

一般にWebサーバでは、物理的なホストファイルシステムと仮想的なフォルダ(公開するされるURLパス)をマッピングする機能を提供しています。Apacheではこの仮想的なフォルダの事をドキュメントディレクトリと呼び、先頭のドキュメントディレクトリをドキュメントルート(DocummentRoot)と呼びます。

DocumentRoot

大雑把に言うと、Apacheは、HTTPリクエストに含まれるURLパスをDocummentRootの最後に追加して、レスポンスとして返すファイルを決定します。従って、ブラウザからはDocumentRootの下のディレクトリやファイルが木構造をしているように見えます。Apache にはバーチャルホストの機能もあります。この場合、それぞれのバーチャルホストに対してDocumentRootを指定することができます。

エイリアス (Alias)

DocumentRootの外にあるディレクトリを公開する方法は、Aliasディレクティブを使う事です。Aliasディレクティブを使えば、ホストファイルシステムの任意の部分をドキュメントディレクトリにマッピングできます。また、ScriptAliasディレクティブもAliasと同様ですが、対象となっているURLパスがCGIの実行を許可するという追加効果があります。

例えば:

Alias /icons/ "C:/usr/Apache2/icons/"  --------------- (1)
ScriptAlias /cgi-bin/ "C:/usr/Apache2/cgi-bin/"  ----- (2)

(1)の例は、URLパス /icons をファイルシステム "C:/usr/Apache Group/Apache2/icons/" にマッピングしています。このエイリアスは、ディレクトリインデックス表示のアイコン画像用にApacheがインストール時に設定したものです。

(2)の例は、URLパス /cgi-bin をファイルシステム "C:/usr/Apache2/cgi-bin" にマッピングしています。このエイリアスは、セキュリティ上の理由により、CGIの実行できるドキュメントディレクトリを限定するためにApacheがインストール時に設定したものです。

また、AliasMatch や ScriptAliasMatch ディレクティブ を使えば正規表現に基づいた強力なエイリアス設定を行なうことができます。

ユーザディレクトリ (UserDir)

Unixシステムではユーザ(user)のホームディレクトリを ~user/ として参照できます。mod_userdirモジュールはこの考えをドキュメントディレクトリに対して拡張し、それぞれのユーザのホームディレクトリのファイルを 以下のようなURLを使ってアクセスできるようにします。

http://localhost/~user/index.html

この設定にはUserDirディレクティブを使用します。セキュリティ面から言えば、Webからユーザのホームディレクトリへの直接アクセスは避けるべきです。従って、UserDirディレクティブではユーザのホームディレクトリの下の、Webファイルの置かれているディレクトリを指定します。尚、Unix ではホームディレクトリを/etc/passwdファイルで指定します。

Apache Windows版についてもユーザディレクトリを設定できます。Windows XPでのユーザのホームディレクトリは既定では "C:/Documents and Settings/user" です。Apacheインストール時の設定では、

UserDir "My Documents/My Website"

なので、上のURLは以下のファイルにマッピングされます。

"C:/Documents and Settings/user/My Documents/My Website/index.html"

ユーザのホームディレクトリを既定の場所以外に設定するには、ドライブ文字から始まる絶対パスで指定します。この場合、ユーザ名に変換される部分にアスタリスク(*)を使用します。

UserDir "D:/Apatch Users/*/My Website"

実験で分かった事ですが、UserDirで既定のホームディレクトリ以外を指定した場合、*で変換される部分は実際に存在するユーザ名である必要がありません。ApacheはURLパスに含まれるユーザ名がWindowsユーザである事の確認をしていないようです。

特定のユーザにのみディレクトリを使用させる場合は、disabledとenabledキーワードを使います。ApatcheはUserDirの引数がenabledでもdisabledでもない場合のみファイル名パターンとして扱います。

UserDir "D:/Apatch Users/*/My Website"
UserDir disabled
UserDir enabled user1 user2 user3

シンボリックリンク

Unixシステムでは、シンボリックリンク機能を使って、DocumentRoot外にあるディレクトリをDocumentRootの下に持ってくることができます。Aliasやユーザディレクトリの場合も、同様です。但し、セキュリティ上の理由により、OptionsディレクティブにFollowSymLinksかSymLinksIfOwnerMatchがある場合に限られます。

Windowsのシンボリックリンクとは何を指すのでしょうか?ショートカットは拡張子が.lnkのファイルで、中にリンク先が書かれているだけです。明らかにシンボリックリンクではありません。Windowsのシンボリックリンクとはジャンクションの事です。NTFSには本来、シンボリックリンクと同等なジャンクションの機能がありますが、ジャンクションを作るには特別なツールを使う必要があります。Windowsでフォルダのジャンクションを作成すると、リンク先フォルダ(ジャンクション)のプロパティ表示に、[シンボリックリンク]タブが現れます。

set02.gif

筆者の実験では、Apacheは、WindowsのジャンクションをUNIXのシンボリックリンクと同様に扱い、FollowSymLinksでのアクセス制御ができました。尚、実験で使用したシンボリックリンク用のツールを以下に挙げておきます。

「リンク作成シェル拡張 for Windows 2000/2003/XP」 Version 1.45 (フリーウエア)
入手先: http://www.vector.co.jp/soft/winnt/util/se184746.html

ジャンクション(シンボリックリンク)にはリンク元とリンク先があり、リンク元が消えるとリンク先も無くなります。一方、WindowsのNTFSにはハードリンク機能もあります、ハードリンクは1つのファイルに複数のディレクトリエントリを作成でき、リンク元/リンク先という関係ではなく対等の関係があります。全てのハードリンクが消えないとファイルは無くなりません。従って通常のファイルはハードリンク数が1という事になります。ハードリンクはシンボリックリンク ではなく、通常のファイルと同じです。Apacheでも勿論、FollowSymLinksの影響を受けません。

尚、ハードリンクはジャンクションと異なり、以下の制限があります。

  • フォルダのハードリンクは作れない
  • 異なったドライブ間でハードリンクは作れない

Windows XPでハードリンクを作るには、fsutil コマンドを使います。大変便利なジャンクションとハードリンクですが、WindowsのGUI(エクスプローラなど)では表向きにはサポートされていません。従って、リンクの管理が大変難しくなっています。特にハードリンクでは、「一見して別のファイルが、実は同じファイルだった」という事が度々起きます。

WindowsのNTFSにはリパースポイントという機能もあります。これはジャンクションをさらに発展させた機能で、フォルダをリパースポイントにしてドライブをマウントする事ができます。Windows XPでは[マイコンピュータ][管理]から[記憶域][ディスクの管理]でドライブを選択し、右クリックで[ドライブ文字とパスの変更]を選択すると、そのドライブを空のフォルダにマウントする事ができます。本来はドライブだけでなくフォルダやファイルもマウントできますが、この機能も隠されています。リパースポイント(フォルダ)のプロパティ表示には、ジャンクションと同じく、[シンボリックリンク]タブがあります。リパースポイントはApacheでもジャンクションと同様に「シンボリックリンク」として扱われFollowSymLinksとしてアクセス制御ができます。

Apache Windows版の「シンボリックリンクのようなもの」をまとめると以下のようになります。

ショートカットリンク先の格納されている単なるファイル(拡張子は.lnk)
ジャンクションUNIXのシンボリックリンクと同じ扱い
ハードリンク通常ファイルと同じ扱い(ファイルシステム上でリンク先/リンク元の関係がない)
リパースポイントUNIXのシンボリックリンクと同じ扱い



以上、Apache Windows版の基本設定について簡単に説明しました。アクセス制御については、「付録 アクセス制御ディレクティブ」に簡単にまとめてあります。Webサーバを公開する場合は、インデックス表示、ファイルタイプ、ユーザ認証、バーチャルホスト、ログファイルなどの設定も必要になります。より詳しい事は「Apache HTTP サーバ バージョン 2.0 ドキュメント( http://httpd.apache.org/docs-2.0/ )」を参照して下さい。



最終更新のRSS Last-modified: Wed, 18 Apr 2007 11:35:35 JST (3870d)