この文書は、バーチャルホストの設定の際に よくある質問に答えるものです。想定している対象は 名前ベース や IP ベース のバーチャルホストを使って 一つのサーバで複数のウェブサイトを運用している状況です。
サーバは IP アドレスを一つ割り当てられていて、DNS でマシンに
複数の名前 (CNAME) が指定されています。このマシンで
www.example.com
と www.example.org
のためのウェブサーバを実行させたいとします。
Apache サーバの設定でバーチャルホストの設定をしただけで、
知らない間にそのホスト名に対応する DNS のエントリが
作成されたりはしません。そのサーバの IP アドレスに解決される
ように DNS に名前を登録しなければなりません。
そうでないと誰もあなたのウェブサイトを見ることはできません。
ローカルでのテストのために hosts
ファイルに
エントリを追加することもできますが、この場合はその
hosts エントリのあるマシンからしか動作しません。
アスタリスクはすべてのアドレスにマッチしますので、主サーバは
リクエストを扱いません。www.example.com
は
最初にあるため、優先順位は一番高くなり、default もしくは
primary のサーバと考えることができます。つまり、リクエストが
どの ServerName
ディレクティブにもマッチしない場合、
一番最初の VirtualHost
により扱われます。
*
をシステムの実際の IP アドレスに置き換える
こともできます。その場合は VirtualHost
の引数は
NameVirtualHost
の引数と同じにしなければなりません
:
しかし、IP アドレスが予測不可能なシステム
――例えばプロバイダから動的に IP アドレスを取得して何らかの
ダイナミック DNS を使っている場合など――においては、*
指定はさらに便利です。*
はすべての IP アドレスに
マッチしますので、この設定にしておけば IP アドレスが変更されても
設定変更せずに動作します。
名前ベースのバーチャルホスティングではほぼすべての状況で、 上記の設定で希望の設定になっていることでしょう。 実際この設定が動作しないのは、IP アドレスやポートの違いによって 違うコンテンツを送るときだけです。
ここで説明されている方法は IP アドレスが 何個あっても同様にできます。
サーバには二つ IP アドレスがついています。一つ目
(172.20.30.40
) では主サーバ
server.domain.com
を扱い、もう一方
(172.20.30.50
) では二つかそれ以上の数の
バーチャルホストを扱います。
172.20.30.50
以外のアドレスへのリクエストは主サーバ
が扱います。172.20.30.50
への、未知のホスト名または
Host:
ヘッダなしのリクエストは www.example.com
が扱います。
サーバマシンは IP アドレスを二つ (192.168.1.1
と 172.20.30.40
) 持っています。このマシンは内部
(イントラネット) と 外部 (インターネット) のネットワークの間に
あります。server.example.com
はネットワークの外からは
外部アドレス (172.20.30.40
) として解決されますが、
ネットワークの中からは内部アドレス (192.168.1.1
)
として解決されます。
VirtualHost
一つだけでサーバが内部のリクエストと
外部のリクエストの両方に同じコンテンツで応答するようにできます。
これでどちらのネットワークからのリクエストも同じ VirtualHost
で扱われるようになります。
内部ネットワークでは完全なホスト名の
server.example.com
の代わりに、単に server
を使うことができます。
上の例では、IP アドレスのリストを、すべてのアドレスに
同じコンテンツで応答する *
に置き換えられます。
同じ IP に複数のドメインがあり、さらに複数のポートを使って リクエストを扱いたいときがあります。"NameVirtualHost" タグの中で ポートを定義することで、これを動作させられます。 NameVirtualHost name:port 無しや Listen ディレクティブで <VirtualHost name:port> を使おうとしても、その設定は動作しません。
サーバは www.example.com
と www.example.org
にそれぞれ解決される、二つの IP アドレス (172.20.30.40
と
172.20.30.50
) があります。
<VirtualHost>
ディレクティブのどれでも
指定されていないアドレス (例えば localhost
) は、
主サーバがあればそこに行きます。
サーバマシンはそれぞれ www.example.com
と
www.example.org
にそれぞれ解決される、IP アドレスを二つ
(172.20.30.40
と 172.20.30.50
) 持っています。
どちらもポート 80 と 8080 でホストを走らせます。
いくつかのマシンでは名前ベースの、その他では IP ベースのバーチャル ホストをします。
Virtual_host
と
mod_proxy を併用する次の例は、フロント側のバーチャルホストで他のマシンへプロクシします。
例では 192.168.111.2
のマシンではバーチャルホスト名は
同じ名前で設定されています。複数のホスト名を一台のマシンにプロクシする
場合は、
_default_
のバーチャルホストを
使う_default_
バーチャルホスト未指定の IP アドレスとポート、つまり他のバーチャルホストに 使われていないアドレスとポートの組み合わせ、へのすべてのリクエストを 受け取ります。
このようにワイルドカードのポートでデフォルトのバーチャルホストを 指定すると、主サーバにリクエストが行くのを防げます。
デフォルトのバーチャルホストは名前ベースのバーチャルホストに
使われているアドレスとポートの組に送られたリクエストを扱うことは
ありません。リクエストが不明な Host:
ヘッダやその
ヘッダがなかったりする場合は基本名前ベースバーチャルホスト (その
アドレスとポートで設定ファイル中で最初のバーチャルホスト) により
扱われます。
どんなリクエストでも
_default_
バーチャルホスト一つめの設定とほぼ同じですが、サーバは複数のポートを listen しており、
80 番ポートに対して二つめの _default_
バーチャルホストを
設定したい場合です。
80 番ポートのデフォルトバーチャルホスト (ワイルドカードポートの デフォルトバーチャルホストよりも前に書かれていなければなりません) は 未指定の IP アドレスに送られたすべてのリクエストを扱います。 主サーバはリクエストを扱いません。
_default_
バーチャルホスト80 番ポートにはデフォルトのバーチャルホストが必要で、他の バーチャルホストはデフォルトが必要ない場合です。
80 番ポートへのアドレス未指定のリクエストはデフォルトのバーチャル ホストから送られます。他の未指定のアドレスとポートへのリクエストは 主サーバから送られます。
ホスト名が名前 www.example.org
のバーチャルホスト
(名前ベースの例の 2 番目の設定) が専用の IP アドレスを
得たとします。名前ベースのバーチャルホストの古い IP アドレスを
キャッシュしているネームサーバやプロキシのために移行期間中は両方の
バーチャルホストを提供したいとします。
答は簡単です。単に新しい IP アドレス (172.20.30.50
)
を VirtualHost
ディレクティブに追加することで
できます。
このバーチャルホストは新しいアドレス (IP ベースのバーチャルホストとして) と古いアドレス(名前ベースのバーチャルホストとして) の両方から アクセスできます。
ServerPath
ディレクティブを
使う名前ベースのバーチャルホストが二つあるサーバがあるとします。
正しいバーチャルホストを得るためにはクライアントは正しい
Host:
ヘッダを送らなければなりません。
古い HTTP/1.0 はそのようなヘッダを送らないので、Apache はクライアントが
どのバーチャルホストを意図したのかさっぱりわかりません
(なので、主バーチャルホストでリクエストを扱います)。
可能な限りの下位互換性を得るため、名前ベースのバーチャルホストの
URL 接頭辞へのリンクの書かれたページを返す、
主バーチャルホストが作成されます。
http://www.sub1.domain.tld/sub1/
は
常に sub1-vhost により扱われます。URL
http://www.sub1.domain.tld/
へのリクエストは
クライアントが正しい Host:
ヘッダを送ったときにのみ
sub1-vhost から送られます。Host:
ヘッダがなければ
クライアントは主ホストの情報ページを得ます。
一つ奇妙な動作をする点があることは覚えておいてください。
http://www.sub2.domain.tld/sub1/
へのリクエストも
Host:
ヘッダがなければ sub1-vhost により扱われます。
正しい Host:
ヘッダを送ったクライアントはどちらの
URL、つまり接頭辞がある方も無い方も使えるように