名前ベースの仮想ホスト

広告

名前ベースの仮想ホストの設定です。名前ベースの場合はIPアドレスは1つしか必要ありません。名前ベースの場合はクライアントからのリクエストに含まれるHostsヘッダーを見てどのホストへアクセスするのかを判断します。

まずアクセス先のIPアドレスに対して名前ベースの仮想ホストを設定していることを表すために「NameVirtualHost」を設定します。

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

IPアドレスを固定で指定するか、又は1つだけしかIPアドレスが無い場合には「*」を記述しても構いません。「*」はサーバに対する全てのIPアドレスと言う意味になります。

NameVirtualHost 192.168.1.1:80

又は

NameVirtualHost *:80

次に「VirtualHost」を使い、ServerName毎に個別の設定を記述していきます。

<VirtualHost IPアドレス:ポート番号>
    ServerName   www1.xxx.jp
    ....
</VirtualHost>

<VirtualHost IPアドレス:ポート番号>
    ServerName   www2.xxx.jp
    ....
</VirtualHost>

リクエストに含まれるHostsヘッダーを参照し、「ServerName」と一致するブロックを探します。一致したブロックが見つかった場合にはそのブロック内の設定が適用されます。

より具体的に考えていきます。「wwww.adminweb.jp」と「www.officepro.jp」の2つのホストに対して「192.168.1.2」が割り当てられているとします。それぞれに対するアクセスがあった場合に、別の動作をさせたい場合には次のように設定します。

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName     www.adminweb.jp
    ServerAdmin    hogehoge@adminweb.jp
    DocumentRoot   "D:/Apache Group/Apache2.2/adminweb_docs"
    CustomLog      logs/adminweb.access.log common
    ErrorLog       logs/adminweb.error.log
</VirtualHost>

<VirtualHost *:80>
    ServerName     www.officepro.jp
    ServerAdmin    hogehoge@officepro.jp
    DocumentRoot   "D:/Apache Group/Apache2.2/officepro_docs"
    CustomLog      logs/officepro.access.log common
    ErrorLog       logs/officepro.error.log
</VirtualHost>

※上記で「*:80」となっている箇所は「192.168.1.2:80」と明示的にIPアドレスを指定しても構いません。

実際のテスト

では実際に試してみます。まず2つのホストに関するDNSの登録を行います。今回はDNSの代わりに「hosts」ファイルに次の記述を行います。(※「hosts」ファイルについては『ホスト名によるアクセス設定(hostsファイル)』を参照して下さい)。

127.0.0.1       www.adminweb.jp
127.0.0.1       www.officepro.jp

次に「httpd.conf」の設定です。仮想ホストに関する設定はApache2.2以降では「httpd-vhosts.conf」ファイルに記述するようになっているようです。

まず「httpd-vhosts.conf」ファイルを有効にします。「httpd.conf」ファイルで「httpd-vhosts.conf」で検索して下さい。デフォルトでは474行目付近に記述があります。

# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

「Include」の先頭に記述されている「#」を外して「httpd-vhosts.conf」を読み込むように設定します。

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

次に「httpd-vhosts.conf」ファイルを編集します。「(Apacheをインストールしたディレクトリ)¥conf¥extra¥」ディレクトリに入っています。

次のような記述がサンプルとして記述されていると思います。(コメント行は省略してあります)。

NameVirtualHost *:80

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.localhost
    DocumentRoot /www/docs/dummy-host.localhost
    ServerName dummy-host.localhost
    ServerAlias www.dummy-host.localhost
    ErrorLog logs/dummy-host.localhost-error_log
    CustomLog logs/dummy-host.localhost-access_log common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.localhost
    DocumentRoot /www/docs/dummy-host2.localhost
    ServerName dummy-host2.localhost
    ErrorLog logs/dummy-host2.localhost-error_log
    CustomLog logs/dummy-host2.localhost-access_log common
</VirtualHost>

今回は次のように記述を変更しました。

NameVirtualHost *:80

<VirtualHost *:80>
    ServerAdmin dumy@adminweb.jp
    DocumentRoot "D:/Apache Group/Apache2.2/adminweb_docs"
    ServerName www.adminweb.jp
    CustomLog logs/adminweb.access.log common
    CustomLog logs/adminweb.error.log
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin dumy@officepro.jp
    DocumentRoot "D:/Apache Group/Apache2.2/officepro_docs"
    ServerName www.officepro.jp
    CustomLog logs/officepro.access.log common
    ErrorLog logs/officepro.error.log
</VirtualHost>

※「httpd-vhosts.conf」ファイルは「Include」によって「httpd.conf」ファイル内に読み込まれます。その為、上記でログのフォーマット名に指定している「common」は「httpd.conf」ファイル内で定義された「common」フォーマットが利用されます。

また上記で設定したドキュメントルートをそれぞれ作り、別々のHTMLファイルを置いてあります。

名前ベースの仮想ホスト

「httpd.conf」ファイルにて、この2つのドキュメントルートに対して適切なアクセス許可を設定します。

<Directory "D:/Apache Group/Apache2.2/adminweb_docs">
    Order allow,deny
    Allow from all
</Directory>

<Directory "D:/Apache Group/Apache2.2/officepro_docs">
    Order allow,deny
    Allow from all
</Directory>

これで準備は完了です。まず「http://www.adminweb.jp/」にアクセスしてみます。

名前ベースの仮想ホスト

「www.adminweb.jp」用のドキュメントルートに含まれるHTMLファイルが表示されます。次に「http://www.officepro.jp/」にアクセスしてみます。

名前ベースの仮想ホスト

「www.officepro.jp」用のドキュメントルートに含まれるHTMLファイルが表示されます。

このように1つのIPアドレスとApacheを使って、複数のドメインを使ったホストに対して別々のページを返すことが出来るようになります。

( Written by Tatsuo Ikura )