バーチャルホスト

全面改定:2002.01.19

 バーチャルホストを動作させると1つのサーバを複数の異なるホスト名でアクセスすることが可能になる。それぞれのホスト毎に異なるドキュメントルートを設定できるので、それぞれのホストは異なる内容を表示する。すなわち、1台のパソコンがあたかも複数の異なるサーバであるかのように動作するのである。サーバにアクセスするユーザには特に御利益はないが、Webサーバ運用者にとってはシステム構築コストもシステム管理コストも1台分で済むので、大変魅力的な仕組みであると言える。

 インターネットサービスプロバイダはホスティングサービスなどでバーチャルホストを利用している。会社や大学などの組織でも複数の部署のサーバを1台で賄えるなど運用コスト削減に効果を発揮するであろう。近年、ダイナミックDNSサービスが急速に普及し、ホスト名が容易に取得可能になったことも後押しして、今後個人の自宅サーバでもバーチャルホストが広まることも考えられる。例えば、全く種類の異なるコンテンツを別のホスト名で公開するようなケース、家族一人一人が自分の名前を付したWebサーバを公開するケース、ファイル容量が制限されているプロバイダのホームページの代用として友人のサーバ運用を請け負うといったケース等々いろいろな使われ方が出てくるかもしれない。

 ところで、AN HTTPDを家庭内LANのWebサーバとして、あるいはプロバイダのサーバへのアップロード前に CGIをローカルにテストするためだけに使用している場合に、バーチャルホストは使い道があるだろうか。私が知らないだけかもしれないが恐らくないであろう。唯一効果があるのは @Niftyのように CGI実行のための専用サーバがあるプロバイダのユーザが、ローカルにCGIをテストするケースである。これについては別途説明したい。もしこれ以外にうまい利用方法のアイデアをお持ちの方がおられれば是非とも教えてください。

 バーチャルホストを使うためにはホスト名を DNSに登録することが必須であり、通常はこの処理はネットワーク管理者に依頼して設定をしてもらうことになる。すなわち、自分自身がネットワーク管理者でなければ DNSへの登録が自由にできるわけではないので、誰でも思い立てばバーチャルホストが使えるということにはならないことを知っておく必要がある。ただし、ダイナミックDNSは誰でも自由に登録ができるので、ダイナミックDNSを使ったバーチャルホストなら思い立てば誰でも使える。

 なお、port番号を変えて複数個のWebサーバを起動し、異なるコンテンツを提供することも可能であるが、この場合は同じホスト名なのでバーチャルホストとは呼ばない。バーチャルホストはAN HTTPDのプログラムが1つ走っているだけであるが、複数のポートでサーバを実行するにはポートの数だけAN HTTPDを走らせないといけないという違いもある。

 以下、AN HTTPD でバーチャルホストを実現するいくつかのケースについて具体的な設定方法を説明する。

 オプション「一般」タブの「バーチャルホスト」をチェックすると「バーチャルホスト」タブが現れ、バーチャルホストの設定はここで行う。


[方法1]ホスト名の別名を使う

 これは Win9x/Me/NT/2000/XP いずれでもバーチャルホストが実現可能な方法である。

 まず、ホストとその別名をDNS登録する(以下で示すサンプルのホスト名、IPアドレス、書式は単に説明用のものである)。
    aa.xx.ne.jp:192.168.0.2
    aa.xx.ne.jp の CNAME:bb(別名登録)
上の例では、IPアドレス 192.168.0.2 にホスト名として aa.xx.ne.jp が、alias として bb.xx.ne.jp が設定されたことになる(別名がもっと必要なら複数個設定できる)。この例はLAN内を想定しているのでプライベートアドレスの 192.168.0.2 を使っているが、インターネット上のサーバならグローバルIPアドレスでないといけない。

 バーチャルホストタブで以下のように設定する。


この設定によって、下記URLへのアクセスが可能となる。
    http://aa.xx.ne.jp/
および http://bb.xx.ne.jp/

ドキュメントルートが doc-aa と doc-bb になっているので、上記2つのURLで表示される内容は当然異なる。ホスト名が違うので2つの別のサーバのように思えるが、実体はAN HTTPDが2つのサーバを実現しているのである。

 次にダイナミックDNSを利用して自宅サーバを公開している例を説明する。ダイナミックDNSでは一台のパソコン(一つのIPアドレス)に対して複数のホスト名を取得できるので、上記の別名定義と全く同じ効果がある。

 例えば、ZiVE と dyn.to でホスト名を取得した場合の例を以下に示す。ダイナミックDNSの場合には IPアドレスは固定ではないので、上記の 192.168.0.2 のように特定のIPアドレスが書けないので、どちらも *.*.*.* を入力する。Ziveで複数のホスト名を取得した場合も全く同様である。


 上のダイナミックDNSの例で、もしミラーサーバとして使うのであればドキュメントルートを同じにすれば、異なるホスト名で同じ内容にアクセスすることができる。一方の DNSが不調になってももう一方でアクセスが可能である。ただし、サーバ自体が不調のときは両方同時にこけるので、厳密な意味ではミラーにはなっていないが。


[方法2]複数のIPアドレスを使う

 この方法はLAN内などIPアドレスが固定の場合に可能であり、ほとんどの自宅サーバでは使用できない。

 WinNT/2000/XP ではTCP/IPの設定で1枚のネットワークカード(NIC)に複数のIPアドレスを割り当てることが可能である。Win9x/Meでは TCP/IPのプロパティにはその設定はないが、WinFAQで紹介された方法 を使えば1枚のNICに複数のIPアドレスを割り当てることが可能である。

 まず、複数のホスト名をDNS登録する(以下で示すサンプルのホスト名、IPアドレス、書式は単に説明用のものである)。
    cc.xx.ne.jp:192.168.1.2
    dd.xx.ne.jp:192.168.1.3

 次に、Win2000では以下の手順で上記2つのIPアドレスを設定する。
コントロールパネル -> ネットワークとダイヤルアップ接続 -> ローカルエリア接続右クリック -> プロパティ -> インターネットプロトコル(TCP/IP)のプロパティ ->詳細設定 -> IP設定でIPアドレスの追加
 WinNTでは、コントロールパネル → ネットワーク → TCP/IPプロトコル → 詳細 で設定する(IPアドレスは最大5個まで)。

 Win9xでは、レジストリ HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans
の、IPAddress を 192.168.1.2,192.168.1.3
に、IPMask を 255.255.255.0,255.255.255.0
のように変更する。

 バーチャルホストタブで以下のように設定する。


この設定によって、下記URLへのアクセスが可能となる。
    http://cc.xx.ne.jp/
および http://dd.xx.ne.jp/


[方法3]複数のネットワークカードを使う

 インターネットからLAN内へのアクセスを遮断するために、パソコンに NICを2枚差し、Firewallを構築することが一般的に行われている。企業などでは、LAN内部向けのWebサーバとインターネット向けの公開Webサーバで別のコンテンツにしたいことがあるが、このような場合は以下の方法でバーチャルホストを実現できる。

 まず、ホスト名をDNS登録する(以下で示すサンプルのホスト名、IPアドレス、書式は単に説明用のものである)。
    ee.xx.ne.jp:グローバルIPアドレス または ダイナミックDNSで登録
    ff.xx.ne.jp:192.168.2.2

 パソコンにネットワークカードを2枚差し、コントロールパネル → ネットワーク → ネットワークの設定 からアダプタを追加する。追加した2枚のカードそれぞれのTCP/IPのプロパティでIPアドレス等を設定する。

 バーチャルホストタブで以下のように設定する。この例はダイナミックDNSでZiveに登録したものである。


この設定によって、下記URLへのアクセスが可能となる。
    http://ee.zive.net/ (インターネットからのアクセス可)
および http://ff.xx.ne.jp/ (インターネットからのアクセス不可)

(注)Win9xでは1台のパソコンに複数のNICを差すことはできない(?)ので、この方法は使えない(?)
  またノートPCの中にはNIC2枚差しができないものもあるようである。
(注の注)Win98でNIC 2枚差しは問題ありませんでした。

 上記 1〜3のいずれの方法でも、portを80以外にしたときは、URLでport番号も指定しなければならない。


[ローカルに試す方法]

 上で、ローカルホストではバーチャルホストはほとんど使い道がないと書いたが、どんなものかどうしても使ってみたいという方は以下のようにすれば試すことができる。

 (1)Win9x/Meであれば、C:\Windows\hosts(Win2000では C:\WinNT\system32\drivers\etc\hosts、WinXPでは C:\Windows\system32\drivers\etc\hosts)を例えば以下のように設定する。
	127.0.0.1 localhost vhost1 vhost2
 (2)バーチャルホストタブで以下のように設定する。


 (3)サーバ機で下記URLにアクセスする。
    http://vhost1/
    http://vhost2/

 ブラウザでプロキシを使用している時は、例外に 127.0.0.1,localhost,vhost1,vhost2(Netscape使用時)、127.0.0.1;localhost;vhost1;vhost2(IE使用時) を追加する。上の例では、http://127.0.0.1/ と http://localhost/ は http://vhost1/ と同じ表示になる。

 上記はサーバ機自身でアクセスする場合であるが、もし LAN内のクライアント機からもアクセスしたいなら上記とは多少設定が異なる。その場合にはサーバ、クライアント機とも hostsファイルを以下のように設定する。
	192.168.0.2 vhost1 vhost2 (ただし 192.168.0.2はサーバ機のIPアドレス)
バーチャルホストの設定を以下のようにする。
	v vhost1 192.168.0.2 80 c:\www\doc1
	v vhost2 192.168.0.2 80 c:\www\doc2
サーバ機からでもクライアント機からでも http://vhost1/、http://vhost2/ でアクセスできる。

 ところで、上記 [方法1] の「ダイナミックDNSを利用して自宅サーバを公開している例」のように、バーチャルホストをインターネットからアクセスできるように設定すると、サーバ機自身からも LAN内の他のクライアント機からもバーチャルホストにアクセスできないという困った事態になる。

 すなわち、ローカルな環境でIPアドレスでアクセスすると設定上、上側にあるホストにしかアクセスできなくなるし、ダイナミックDNS登録したホスト名で呼ぶとインターネット上にあるダイナミックDNSはローカルホストの名前解決には機能しないので「サーバが見つからないか、DNS エラーです」になってしまうのである。

 そこでこの上と同様に hosts を使えば解決可能である。サーバ機、クライアント機とも hostsを以下のように設定すれば(192.168.0.2 はサーバ機のプライベートIPアドレス)、http://aa.zive.net/ や http://bb.dyn.to/ でローカル環境でもアクセス可能となる。
	192.168.0.2 aa.zive.net bb.dyn.to
ここで注意しないといけないのは、ローカルにバーチャルホスト名でアクセスできたからといって、インターネットからもアクセスが可能な設定ができているとは限らないという点である。外からアクセス可能であるかどうかを確認するにはあくまで外からアクセスする方法を用いなければならない。

[使用上の注意事項]
  1. ユーザ認証、アクセス制限は全てのバーチャルホストに共通に効いてしまうので、ディレクトリ、エイリアスには異なる名前を付けた方がよい。ただし、ドキュメントルートは全て / で区別しようがないので、特定のホストのドキュメントルートだけにユーザ認証/アクセス制限をすることはできない。

  2. ログは全てのホストの分が区別なく記録されてしまう。ディレクトリ名/エイリアスが異なれば区別は何とか可能であるが、同じディレクトリ名/エイリアスは区別するのは困難である。特にルートディレクトリへのアクセスがあったときにどのホストのものかを判別するのは不可能である。

  3. エイリアスは共通のものがあってもそれぞれのホスト毎に設定が必要である。


作成:いと,mailto:gfh05223@nifty.com