[APACHE DOCUMENTATION]

Apache HTTP Server Version 1.3

この文書では名前ベースのバーチャルホストをどんなとき、 またどうやって使うのかということを説明します。

参考: 標準的なセットアップでの バーチャルホストの例IP ベースの バーチャルホストのサポート バーチャルホストのマッチングの具体的な詳細大量のバーチャルホストを動的に設定する


名前ベースと IP ベースのバーチャルホストの比較

初期のバージョンの HTTP では (他の多くのプロトコル、例えば FTP と同様) 一つのサーバ上でのバーチャルホストごとに異なった IP アドレスが必要でした。いくつかのプラットフォームでは、このことが 実行可能なバーチャルホストの数を限定してしまうことになりました。また、 IP アドレスの数には限りがあるということについての懸念から、レジストラ (ARIN, RIPE, APNIC) はバーチャルホストごとに IP を割り当てるようなことは避けるよう強く要請しています。

名前ベースのバーチャルホストは通常単純で、 それぞれのホスト名とそれに対応する正確な IP アドレスを DNS で設定し、異なるホスト名を区別出来るように Apache HTTP サーバを設定するだけです。さらに、名前ベースのバーチャルホストは不足する IP アドレスの需要を緩和します。したがって、IP ベースのバーチャルホストを選択すべき特定の理由がなければ名前ベースの バーチャルホストを使うべきです。 IP ベースのバーチャルホストを使用することを考慮する理由として、

名前ベースのバーチャルホストを利用する

関連ディレクティブ

DocumentRoot
NameVirtualHost
ServerAlias
ServerName
ServerPath
VirtualHost

名前ベースのバーチャルホストを使うには、そのホストへの リクエストを受け付けるサーバの IP アドレス (もしかしたらポートも) を指定する必要があります。 これは NameVirtualHost ディレクティブで設定します。通常、NameVirtualHost* の属性を使ってサーバのすべての IP アドレスを使います。 (NameVirtualHost * はバージョン 1.3.13 以降のみで動作します。) NameVirtualHost ディレクティブで IP アドレスを書いても、 自動的にサーバがその IP アドレスをリッスンするということはないことに 注意してください。詳細は Apache の使うアドレスと ポートを設定する を読んでください。さらに、ここで指定された IP アドレスはすべてサーバのネットワークインターフェースと関連付けられて いなければなりません。

次は、扱いたいそれぞれのホストに対して <VirtualHost> ブロックを作成してください。<VirtualHost> ディレクティブの引数は NameVirtualHost ディレクティブの引数と同じにしてください (すなわち、IP アドレス一つやすべてのアドレスを表す *)。それぞれの <VirtualHost> ディレクティブの中には、最低限、 どのホストが扱われるかを示す ServerName ディレクティブと、 そのホスト用のコンテンツがファイルシステム上のどこにあるかを示す DocumentRoot ディレクティブを書く必要があります。

既に存在するウェブサーバにバーチャルホストを追加する場合、 存在するホスト用の <VirtualHost> ブロックを作らなければなりません。 ServerNameDocumentRoot はこのバーチャルホストも含めて、それぞれグローバルな ServerName 及び DocumentRoot と同じものにするべきです。設定ファイル中で最初に記述した このバーチャルホストは デフォルトのバーチャルホストとしても振る舞います。

例えば、ドメイン www.domain.tld を運用しているところに バーチャルホスト www.otherdomain.tld を追加する場合で、 両方が同じ IP アドレスを指しているとします。そのような場合は、 httpd.conf に以下のようなコードを追加するだけです

    NameVirtualHost *

    <VirtualHost *>
    ServerName www.domain.tld
    DocumentRoot /www/domain
    </VirtualHost>

    <VirtualHost *>
    ServerName www.otherdomain.tld
    DocumentRoot /www/otherdomain
    </VirtualHost>

NameVirtualHost 及び <VirtualHost> のどちらの場合も、 * の部分には明示的に IP アドレスを指定することができます。 バージョン 1.3.12 以前では IP アドレスの指定が必要でした。

複数の名前でサーバアクセスができるようにしたいことも多いでしょう。 このようなことは、ServerAlias ディレクティブを <VirtualHost> セクションに記述することで実現できます。 例えばこれを最初の <VirtualHost> ブロックに書き加えると、

    ServerAlias domain.tld *.domain.tld

domain.tld ドメインへのすべてのホストへのリクエストは www.domain.tld のバーチャルホストが処理します。 * や ? をワイルドカード文字として使用できますが、当然ながらそれだけで ServerNameServerAlias の名前や場所を構成することはできません。まず最初に DNS のホスト名と IP アドレスをサーバにあわせて適切に設定する事が必要です

最後に、<VirtualHost> コンテナの中に 他のディレクティブを書くことで、バーチャルホストの設定を細かく変更 することができます。どのディレクティブを書くことができるかは、 ディレクティブの コンテキスト を 調べてください。主サーバコンテキスト (<VirtualHost> コンテナの外) の 設定用ディレクティブはバーチャルホストでの設定で上書きされていない ときのみ使用されます。

リクエストが来ると、サーバはまず最初に NameVirtualHost にマッチする IP アドレスかどうかをチェックします。マッチすれば マッチした IP アドレスの <VirtualHost> のそれぞれのセクションの中から ServerNameServerAlias に要求されたホスト名があるか探します。 見つかればそのサーバ用の設定を使います。マッチするバーチャルホスト が見つからなければ、マッチした IP アドレスの リストの最初にあるバーチャルホスト が使われます。

結果として、リストの最初のバーチャルホストが デフォルト の バーチャルホストになります。IP アドレスが NameVirtualHost ディレクティブにマッチした場合は、メインのサーバDocumentRoot 使われ ません どのバーチャルホストにもマッチしないリクエストに対して、 特別な設定をしたいのであれば、設定ファイル中の最初の <VirtualHost> にそれを記述してください。

古いブラウザとの互換性

上で書いたように、名前ベースのバーチャルホストが正しく動作する ために必要な情報を送ってこないクライアントが依然として存在しています。 そのようなクライアントに対しては、該当する IP アドレスについて、 一番最初に設定されているバーチャルホスト (プライマリの名前ベースのバーチャルホスト) からページが送り返されます。

ServerPath ディレクティブで対処が可能です。ちょっと不格好ですけれども。

設定例

    NameVirtualHost 111.22.33.44

    <VirtualHost 111.22.33.44>
    ServerName www.domain.tld
    ServerPath /domain
    DocumentRoot /web/domain
    </VirtualHost>

この例にはどういう意味があるでしょうか? これは "/domain" で始まる URI へのリクエストはすべて、 バーチャルホスト www.domain.tld で処理される、 という意味です。つまり、すべてのクライアントで http://www.domain.tld/domain/ でアクセスできるページが、 Host: ヘッダを送ってくるクライアントであれば http://www.domain.tld/ としてもアクセスできる、 という意味です。

これを実用的なものとするためには、 プライマリのバーチャルホストのページに http://www.domain.tld/domain/ へのリンクを設置します。 そして、バーチャルホストのページでは、純粋な相対リンク (例: "file.html" や "../icons/image.gif")、 あるいは /domain/ で始まるリンク (例: "http://www.domain.tld/domain/misc/file.html" や "/domain/misc/file.html") だけを設置します。

これには、幾分かの規律が必要となりますが、 このようなガイドラインを忠実に守ることにより、たいていの場合、 すべてのブラウザで ― 新しいブラウザでも古いものでも ― 作成したページが見えるということを保証します。

参考: ServerPath 設定例


Apache HTTP Server Version 1.3

Index Home