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

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

(Last modified: )

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

名前ベースのバーチャルホストでは 1 つの IP アドレスで複数の Web サーバを公開することができます。

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

httpd.conファイルの設定

Apache 2.4 系より前のバージョンを使用する場合は、下記の NameVirtualHost ディレクティブを使って設定を記述してください。 Apache 2.4 系以降は NameVirtualHost ディレクティブの設定は不要です。設定した場合は Apache を起動したときに「AH00548: NameVirtualHost has no effect and will be removed in the next release」とメッセージが表示されます。

---- Apache 2.4 系より前の場合に必要な設定 ----

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

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

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

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

NameVirtualHost 127.0.0.1:80
NameVirtualHost *:80

---- ここまで ----

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

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

名前ベースのバーチャルホストでは使用する IP アドレスは 1 つなので、すべての VirtualHost ディレクティブには同じ IP アドレスを指定します。複数の IP アドレスをすべて名前ベースのバーチャルホストで設定する場合は IP アドレスの代わりに * を指定してください。

1 つの IP アドレスを使用する場合:

<VirtualHost 127.0.0.1:80>
  ...
  ...
</VirtualHost>

<VirtualHost 127.0.0.1:80>
  ...
  ...
</VirtualHost>

複数の IP アドレスを使用する場合:

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

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

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

今回は公開する Web サーバが 2 つなので、次のように記述しました。( Apache 2.4 系より前の場合は最初に NameVirtualHost ディレクティブの記述を追加してください)。

<VirtualHost 127.0.0.1:80>
  ServerName    www.example.com
  ServerAdmin   admin@example.com
  DocumentRoot  c:/pg/Apache/htdocs_com
</VirtualHost>

<VirtualHost 127.0.0.1:80>
  ServerName    www.example.jp
  ServerAdmin   admin@example.jp
  DocumentRoot  c:/pg/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 ファイルを保存してください。

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

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

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

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

127.0.0.1  www.example.com
127.0.0.1  www.example.jp

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

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

準備ができましたら Apache を再起動してください。

動作確認

では最初にブラウザから http://www.example.com/ へアクセスしてみます。 www.example.com 用のドキュメントルートに設置された index.html ファイルがクライアントへ返されて表示されました。

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

次にブラウザから http://www.example.jp/ へアクセスしてみます。 www.example.jp 用のドキュメントルートに設置された index.html ファイルがクライアントへ返されて表示されました。

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

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

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

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

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

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

<VirtualHost 127.0.0.1:80>
  ServerName    www.example.com
  ServerAdmin   admin@example.com
  DocumentRoot  c:/pg/Apache/htdocs_com
</VirtualHost>

<VirtualHost 127.0.0.1:80>
  ServerName    www.example.jp
  ServerAdmin   admin@example.jp
  DocumentRoot  c:/pg/Apache/htdocs_jp
</VirtualHost>

ここで http://blog.example.com/ へアクセスした場合、 VirtualHost ディレクティブの ServerName に設定されているホストと一致するものがありません。この場合は httpd.conf ファイルの中で一番最初に書かれている VirtualHost ディレクティブと一致したとみなされます。よって、 http://www.example.com/ へアクセスした場合と同じドキュメントルート以下のコンテンツをクライアントへ返します。

それではテストをするために hosts ファイルに次の 1 行を追加します。 httpd.conf ファイルの方は変更がありません。

127.0.0.1  www.example.com
127.0.0.1  www.example.jp
127.0.0.1  blog.example.com

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

ブラウザから http://www.example.com/ や http://www.example.jp/ へアクセスした場合は、先ほどと同じでそれぞれ対応するドキュメントルートにあるコンテンツが返されます。

ブラウザから http://blog.example.com/ へアクセスすると対応するバーチャルホストの設定がないため、一番最初に書かれているバーチャルホストの設定にあるドキュメントルートのコンテンツが返されます。

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

-- --

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

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。