前置きが長くなってしまったが、設定の解説に移ろう。バーチャルホストは、概念が複雑な割に設定そのものは単純である。ただし、バーチャルホストにはDNSの設定が不可欠である。複数のホストを賄うにしろ複数のドメインを担うにしろ、DNSの変更なしにアクセスを受け入れることなどできないからである。
まず、DNSの設定を済ませてしまおう。IPベースの場合は、ホストごとにIPアドレスを持つので特殊な設定は必要ない。ゾーンファイルに、
www IN A 172.16.1.11 linux IN A 172.16.1.12
という具合に、Aレコードを羅列していくだけである(ゾーンファイルの設定については、「BINDで作るDNSサーバ」第2回 名前解決の仕組みとゾーンファイルの設定を参照)。つまり、それぞれユニークなIPアドレスを持った複数のWebサーバが存在するものとして、各ホストを通常どおりに登録するだけである。
Apacheの設定には、VirtualHostディレクティブを利用する。VirtualHostディレクティブは、
<VirtualHost IPアドレス> 〜 </VirtualHost>
のように記述し、これが1ホスト分のブロックとなる。つまり、バーチャルホストでホスティングしたいホストの数だけ、このブロックを記述すればよい。IPベースで注意する点は、VirtualHost IPアドレスのIPアドレスを各ブロックで異なるものにしなければならないということである。Apacheは、このIPアドレスでホストの設定のブロックを識別するからである。
<VirtualHost>と</VirtualHost>の間には、各ホストの設定に必要なディレクティブを列挙する。最低限、ホスト名を表すServerNameディレクティブとそのホストのコンテンツディレクトリを表すDocumentRootディレクティブを記述しなくてはならない。これ以外はオプション的な扱いとなるが、管理者のメールアドレスを表すServerAdminディレクティブやログファイルの位置を表すErrorLog、TransferLogディレクティブくらいは記述しておくことをお勧めする。従って、VirtualHostディレクティブで囲まれたブロックの基本構造は、
<VirtualHost IPアドレス> ServerName ホスト名 DocumentRoot コンテンツディレクトリ ServerAdmin 管理者メールアドレス(省略するとデフォルト値) ErrorLog エラーログファイル名(省略するとデフォルト値) TransferLog アクセスログファイル名(省略するとデフォルト値) </VirtualHost>
となる。
以上の条件に従って、「www」と「linux」という2つのホストを定義したものが次の例である。このようなものをApacheの設定ファイルhttpd.confの最後に記述する。最後でなくても構わないが、httpd.confの最後にVirtualHostディレクティブの例が示されているため、これに準じて最後に記述するのが一般的だ。
<VirtualHost 192.168.1.11> ServerName www.atmarkit.co.jp DocumentRoot /www/httpd/www ServerAdmin webmaster@www.atmarkit.co.jp ErrorLog logs/error_log TransferLog logs/access_log </VirtualHost> <VirtualHost 192.168.1.12> ServerName linux.atmarkit.co.jp DocumentRoot /www/httpd/linux ServerAdmin linuxmaster@www.atmarkit.co.jp ErrorLog logs/linuxerror_log TransferLog logs/linuxaccess_log </VirtualHost>
最後に、IPベースのバーチャルホストではBindAddressディレクティブにも注意してほしい。BindAddressディレクティブは、そのApacheがリクエストを受け付けるIPアドレスを定義する。例えば、
BindAddress 192.168.1.11
と書かれていたら、そのApacheは192.168.1.11にアクセスされた場合しか要求を受け付けなくなる。IPベースでは複数のIPアドレスを受け付けなければならないので、これではまずい。複数のIPアドレスでアクセスを受け付けたければ、
BindAddress 192.168.1.11 192.168.1.12
のようにIPアドレスを続けて書くか、
BindAddress 192.168.1.*
としてワイルドカードを使う。また、
BindAddress *
とすれば、そのサーバに割り当てられたすべてのIPアドレスへのアクセスを受け入れるようになる。
こちらもIPベースと同様、DNS、Apacheの順で解説する。
IPベースの場合は、Aレコードで各ホストとIPアドレスの対応をDNSに登録していた。しかし、NAMEベースの場合はIPアドレスが1つしかないため、Aレコードで登録することはできない。NAMEベースでは、1ホスト分のみAレコードで登録し、残りのホストはCNAMEレコードで別名定義する。例えば、「www」と「linux」という2つのホストを172.16.1.11という1つのIPアドレスで運用するなら、
www IN A 172.16.1.11 linux IN CNAME www
と記述する。まずAレコードでwwwというホストに172.16.1.11というIPアドレスを割り当てる。linuxというホストはCNAMEを使ってwwwの別名として登録する。こうすることで、172.16.1.11というIPアドレスにはwwwとlinuxという2つのホスト名が割り当てられたことになる。ホストを増やす場合は、同様に
ホスト名 IN CNAME www
という行を追加していけばよい。
NAMEベースの場合、使うIPアドレスは1つだけなのでBindAddressディレクティブへの注意は必要ない。その代わり、NameVirtualHostディレクティブを使って複数のホスト名で共有するIPアドレスを示さなくてはならない。
以下の例は、192.168.1.11でwwwとlinuxの2つのホスト名を利用する場合の設定例だ。
NameVirtualHost 192.168.1.11 <VirtualHost 192.168.1.11> ServerName www.atmarkit.co.jp DocumentRoot /www/httpd/www ServerAdmin webmaster@www.atmarkit.co.jp ErrorLog logs/error_log TransferLog logs/access_log </VirtualHost> <VirtualHost 192.168.1.11> ServerName linux.atmarkit.co.jp DocumentRoot /www/httpd/linux ServerAdmin linuxmaster@www.atmarkit.co.jp ErrorLog logs/linuxerror_log TransferLog logs/linuxaccess_log </VirtualHost>
NameVirtualHostの追加と、VirtualHostに記述するIPアドレスが共通であることを除けば、IPベースの設定とNAMEベースの設定に違いはない(編注2)。
編注2:ところで、NAMEベースのバーチャルホストを構築しているサイトに、IPアドレスでアクセスしたらどうなるだろうか? 答えは、「最初に記述されたブロックの設定が使われる」である。つまり、上記の例の場合はwwwというホストとして処理されるのである。バーチャルホストを構築する場合は、デフォルトとして機能するホストを最初に記述するようにしよう。
以上のように、バーチャルホストは概念が少々複雑だから方針の決定や設計には注意が必要だが、設定そのものは難しくない。
次回は、Webのセキュリティについて紹介しようと思う。Webサーバで提供するコンテンツのセキュリティ管理には、十分に気を使わなくてはならない。ファイアウォールやセキュリティホールの管理、ウイルスへの対応策ばかりに注目が集まるが、だれもがアクセスできるWebサーバのコンテンツにも注意が必要なのである。
Copyright © ITmedia, Inc. All Rights Reserved.