Apache | 仮想ホスト(VirtualHost)の設定 | 名前ベースの仮想ホスト
名前ベースの仮想ホスト
名前ベースの場合、IPアドレスは1つでなくてもよい。名前ベースでは、クライアントのリクエストに含まれる Host ヘッダーを見て、どのホストにアクセスするかを決定する。
まず VirtualHost を使用して、ServerName ごとに設定する。
<VirtualHost IPアドレス:ポート番号>
ServerName www1.devkuma.com
....
</VirtualHost>
<VirtualHost IPアドレス:ポート番号>
ServerName www2.devkuma.com
....
</VirtualHost>
リクエストに含まれる Host ヘッダーを参照し、ServerName と一致するブロックを探す。一致するブロックが見つかると、そのブロックの設定が適用される。
もう少し具体的に説明すると、ww1.devkuma.com と ww2.devkuma.com の2つのホストを1つ以上のIPアドレスに割り当て、それぞれへのアクセスで異なる動作をさせるには、次のように設定する。
<VirtualHost *:80>
ServerName ww1.devkuma.com
ServerAdmin devkuma@devkuma.com
DocumentRoot "${SRVROOT}/htdocs-ww1"
CustomLog logs/ww1.access.log common
ErrorLog logs/ww1.error.log
</VirtualHost>
<VirtualHost *:80>
ServerName ww2.devkuma.com
ServerAdmin devkuma@devkuma.com
DocumentRoot "${SRVROOT}/htdocs-ww2"
CustomLog logs/ww2.access.log common
ErrorLog logs/ww2.error.log
</VirtualHost>
※ 上記の *:80 と指定されている部分は、192.168.1.2:80 のように明示的にIPアドレスを指定してもよい。
実習
それでは実際に試してみる。まず2つのホストをDNSに登録する。ここではDNSの代わりに、hosts ファイルへ次のように記述する。※ hosts ファイルについては ホストアクセス設定(hostsファイル) を参照する。
127.0.0.1 ww1.devkuma.com
127.0.0.1 ww2.devkuma.com
次は httpd.conf の設定である。仮想ホストの設定は httpd-vhosts.conf ファイルに記述する。
まず httpd-vhosts.conf ファイルを使用する。httpd.conf ファイルで httpd-vhosts.conf を検索すると、次のような内容が見つかるはずである。
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
Include の前にある # を削除し、httpd-vhosts.conf を読み込むように設定する。
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
次に httpd-vhosts.conf ファイルを修正する。このファイルは (Apacheインストールディレクトリ)Apache24\conf\extra ディレクトリにある。
次のようなサンプルが記述されているはずである。ここではコメントを省略する。
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "${SRVROOT}/docs/dummy-host.example.com"
ServerName dummy-host.example.com
ServerAlias www.dummy-host.example.com
ErrorLog "logs/dummy-host.example.com-error.log"
CustomLog "logs/dummy-host.example.com-access.log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "${SRVROOT}/docs/dummy-host2.example.com"
ServerName dummy-host2.example.com
ErrorLog "logs/dummy-host2.example.com-error.log"
CustomLog "logs/dummy-host2.example.com-access.log" common
</VirtualHost>
ここでは次のように変更する。
<VirtualHost *:80>
ServerName ww1.devkuma.com
ServerAdmin devkuma@devkuma.com
DocumentRoot "${SRVROOT}/htdocs-ww1"
CustomLog logs/ww1.access.log common
ErrorLog logs/ww1.error.log
</VirtualHost>
<VirtualHost *:80>
ServerName ww2.devkuma.com
ServerAdmin devkuma@devkuma.com
DocumentRoot "${SRVROOT}/htdocs-ww2"
CustomLog logs/ww2.access.log common
ErrorLog logs/ww2.error.log
</VirtualHost>
※ httpd-vhosts.conf ファイルは Include によって httpd.conf ファイルに読み込まれる。そのため、上記で指定しているログ形式名 common には、httpd.conf ファイルで定義された common 形式が使用される。
また、上で設定した通りに各ドキュメントルートを作成し、それぞれ別のHTMLファイルを次のように作成して配置する。
{Apacheインストールディレクトリ}/htdocs-ww1/index.html
<html>
<body>
<h1>WW1 Page</h1>
</body>
</html>
{Apacheインストールディレクトリ}/htdocs-ww2/index.html
<html>
<body>
<h1>WW2 Page</h1>
</body>
</html>
httpd.conf ファイルで、次のように2つのドキュメントルートに適切な権限を設定する。
<Directory "${SRVROOT}/htdocs-ww1">
Require all granted
</Directory>
<Directory "${SRVROOT}/htdocs-ww2">
Require all granted
</Directory>
これで準備は完了である。まず http://ww1.devkuma.com にアクセスしてみる。

ww1.devkuma.com 用のドキュメントルートに含まれるHTMLファイルが表示される。
次に http://ww2.devkuma.com/ にアクセスしてみる。

ww2.devkuma.com 用のドキュメントルートに含まれるHTMLファイルが表示される。
これで、1つのIPアドレスとApacheを使用し、複数ドメインのホストに対して別々のページを返す方法を確認した。