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

広告

Apache のバーチャルホストの設定方法の中で、ひとつの IP アドレスだけを使って複数の Web サーバを公開する名前ベースのバーチャルホストの設定方法について解説します。 NameVirtualHost ディレクティブ、および VirtualHost ディレクティブを使用します。

名前ベースのバーチャルホストを設定する

名前アドレスベースのバーチャルホストでは 1 つの IP アドレスで複数の Web サーバを公開することができます。今回は 2 つ Web サーバを公開するために 1 つの IP アドレスを使用しました。 IP アドレスと Web サイトの URL の対応は次のとおりです。

192.168.10.104
>> http://www.example.com
>> http://www.example.jp

それでは設定を行っていきます。

httpd.conファイルの設定

名前ベースのバーチャルホストの設定には最初に使用する IP アドレスを NameVirtualHost ディレクティブを使って設定します。書式は次のとおりです。

NameVirtualHost IPアドレス[:ポート番号]

記述できる場所は httpd.conf です。

IP アドレスには特定の IP アドレスを指定してもいいですし、サーバが複数の IP アドレスを利用できる状況で、名前ベースのバーチャルホストにすべての IP アドレスを使用する場合には * を記述することもできます。

NameVirtualHost 192.168.0.1:80
NameVirtualHost *:80

次に公開する Web サーバ毎に VirtualHost ディレクティブを使って次のように記述します。

<VirtualHost IPアドレス[:ポート番号]>
  ...
  このバーチャルホストへの設定
  ...
</VirtualHost>

名前ベースのバーチャルホストでは使用する IP アドレスは 1 つなので、すべての VirtualHost ディレクティブには同じ IP アドレスを指定します。このとき、 NameVirtualHost ホストで指定した IP アドレスと同じ値を指定してください。例えば特定の IP アドレスを指定した場合は VirtualHost ディレクティブでも同じ IP アドレスを指定し、 * を使って指定した場合は、 VirtualHost ディレクティブでも * を指定してください。

NameVirtualHost *:80

<VirtualHost *:80>
  ...
  ...
</VirtualHost>

<VirtualHost *:80>
  ...
  ...
</VirtualHost>

それぞれのブロック内で対象のバーチャルホストに対する設定を行います。設定は ServerAdmin ディレクティブ、 DocumentRoot ディレクティブ、 ServerName ディレクティブなどを設定します。(必要であれば CustomLog ディレクティブや ErrorLog ディレクティブの設定も記述していきます)。

今回は公開する Web サーバが 2 つなので、次のように記述しました。

NameVirtualHost 192.168.10.104:80

<VirtualHost 192.168.10.104:80>
  ServerName    www.example.com
  ServerAdmin   admin@example.com
  DocumentRoot  d:/pg/Apache/Apache24/htdocs_com
</VirtualHost>

<VirtualHost 192.168.10.104:80>
  ServerName    www.example.jp
  ServerAdmin   admin@example.jp
  DocumentRoot  d:/pg/Apache/Apache24/htdocs_jp
</VirtualHost>

名前ベースのバーチャルホストでは、リクエスト先の IP アドレスではどの Web サーバへのアクセスか判断ができませんので、リクエストに含まれる Host ヘッダーを参照し、 ServerName で設定したホスト名と一致する VirtualHost ディレクティブのブロックを探します。一致したブロックが見つかった場合にはそのブロック内のドキュメントルート以下のコンテンツがクライアントへ返されます。

その他の設定として、それぞれのドキュメントルートに設定しているディレクトリに対してアクセスを許可しておきます。

<Directory "${SRVROOT}/htdocs_com">
  Require all granted
</Directory>

<Directory "${SRVROOT}/htdocs_jp">
  Require all granted
</Directory>

以上の設定を httpd.conf ファイルの最後に記述しました。記述が終わりましたら httpd.conf ファイルを保存し Apache を再起動してください。

公開するコンテンツの用意とDNSの設定

それぞれのドキュメントルートに指定したディレクトリを作成し、ドキュメントルートの中に index.html ファイルをそれぞれ作成して設置しました。

名前ベースのバーチャルホストを設定する(1)

次に www.example.com と www.example.jp に対して IP アドレスを割り当てます。通常はそれぞれのドメインを管理している DNS サーバにてそれぞれ A レコードなどを登録することになりますが、今回はローカル環境なので hosts ファイルを使って割り当てました。

192.168.10.104  www.example.com
192.168.10.104  www.example.jp

※ hosts ファイルを使った設定方法については「ホスト名によるアクセス設定(hostsファイル)」を参照されてください。

これで準備はすべて完了です。

動作確認

では最初にブラウザから http://www.example.com/ へアクセスしてみます。

名前ベースのバーチャルホストを設定する(2)

www.example.com 用のドキュメントルートに設置された index.html ファイルがクライアントへ返されて表示されました。

次にブラウザから http://www.example.jp/ へアクセスしてみます。

名前ベースのバーチャルホストを設定する(3)

www.example.jp 用のドキュメントルートに設置された index.html ファイルがクライアントへ返されて表示されました。

このように 1 つの Apache で 1 つの IP アドレスを使って複数の Web サイトをそれぞれ公開することができました。

デフォルトのバーチャルホスト

例えば名前ベースのバーチャルホストで 1 つの IP アドレスに対して 3 つの Web サーバを割り当てる場合で考えてみます。

192.168.10.104
>> http://www.example.com
>> http://blog.example.com
>> http://www.example.jp

ただ設定としてはこの中の 2 つのホストに対してだけ設定したとします。

NameVirtualHost 192.168.10.104:80

<VirtualHost 192.168.10.104:80>
  ServerName    www.example.com
  ServerAdmin   admin@example.com
  DocumentRoot  d:/pg/Apache/Apache24/htdocs_com
</VirtualHost>

<VirtualHost 192.168.10.104:80>
  ServerName    www.example.jp
  ServerAdmin   admin@example.jp
  DocumentRoot  d:/pg/Apache/Apache24/htdocs_jp
</VirtualHost>

この時、ブラウザからホストの設定がされていない http://blog.example.com/ へアクセスした場合にどうなるのかを考えてみます。まず IP アドレスは NameVirtualHost ディレクティブで設定されている値と一致するため名前ベースのバーチャルホストとして扱われます。ただ VirtualHost ディレクティブの ServerName に設定されているホストと一致するものがありません。この場合は httpd.conf ファイルの中で一番最初に書かれている VirtualHost ディレクティブと一致したとみなされます。よって、 http://www.example.com/ へアクセスした場合と同じドキュメントルート以下のコンテンツをクライアントへ返します。

-- --

Apache のバーチャルホストの設定方法の中で、ひとつの IP アドレスだけを使って複数の Web サーバを公開する名前ベースのバーチャルホストの設定方法について解説しました。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。