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.comww2.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を使用し、複数ドメインのホストに対して別々のページを返す方法を確認した。