Apache HTTPD でバーチャルホストを使う設定手順の紹介です。一応 CentOS 6 環境を前提としますが、多くのケースで他の環境にも応用できる情報だと思っています。


バーチャルホストは、1つのウェブサーバー(Apache HTTPD)で複数のウェブサイトを運用するものです。 「複数のウェブサイト」の考え方ですが、例えば以下の例のようにディレクトリ単位で分けるのであればバーチャルホストを使わなくても1つのウェブサーバーで(ドキュメントルート以下のディレクトリを分けるだけで)運用できます:
 http://www.xxxxxx.com/host1/  (ホスト1)
 http://www.xxxxxx.com/host2/  (ホスト2)
 http://www.xxxxxx.com/host3/  (ホスト3)

でも以下のような、ディレクトリの違いではなく、ホスト名やサブドメインの違いによる複数のウェブサイトを1台のウェブサーバーで運用するにはバーチャルホストの設定が必要です:
 http://www1.xxxxxx.com/  (ホスト1)
 http://www2.xxxxxx.com/  (ホスト2)
 http://www3.xxxxxx.com/  (ホスト3)

上記のようなケースでのバーチャルホストの設定方法を紹介します。なお、前提条件として以下のような条件とします:
(1) DNS は設定済み(www1.xxxxxx.com, www2.xxxxxx.com, www3.xxxxxx.com いずれにも同じ IP アドレスが設定されていて、これらの名前全てでバーチャルホストを設定するマシンが参照できる)
(2) ユーザーが http://www1.xxxxxx.com/ にアクセスしてきたらドキュメントルート1(/var/www/html/vh1/)以下に誘導する
(3) ユーザーが http://www2.xxxxxx.com/ にアクセスしてきたらドキュメントルート2(/var/www/html/vh2/)以下に誘導する
(4) ユーザーが http://www3.xxxxxx.com/ にアクセスしてきたらドキュメントルート3(/var/www/html/vh3/)以下に誘導する
(5) ユーザーが IP アドレスなど上記以外の名前で http アクセスを行ってきたらエラーとする(ホスト名でしか参照できなくする)


まず最初に (1) の名前解決についての設定をしておきます。本当にドメイン(ここでは xxxxxx.com としますが、他のドメインの場合は読み替えてください)やグローバルIPアドレスを取得していて、www1.xxxxxx.com / www2.xxxxxx.com / www3.xxxxxx.com いずれも世界中から参照できる IP アドレスに結びつけることができるよう DNS 設定が可能な場合はそのように設定しておいてください。 一方、実際にはドメインを取得しておらず(或いは取得しているドメインは使わず)あくまでテスト目的でバーチャルホスト環境を構築するのであれば、/etc/hosts ファイルを編集して以下の赤字部分を追記します:
127.0.0.1      localhost localhost.localdomain www1.xxxxxx.com www2.xxxxxx.com www3.xxxxxx.com

この赤字部分を追記することで、とりあえずこのマシン上からは www1.xxxxxx.com / www2.xxxxxx.com / www3.xxxxxx.com いずれの名前でも 127.0.0.1 に結びつきました。つまり、このマシン上からは www1.xxxxxx.com / www2.xxxxxx.com / www3.xxxxxx.com の名前でアクセスできる環境が整いました。このマシン以外からの動作確認を行う場合は 127.0.0.1 ではなく、実際の IP アドレスに紐付けるように hosts ファイルを編集してください。


名前解決の準備ができたら Apache HTTPD サーバーをインストールします。CentOS であれば以下のコマンドでインストールできます:
# yum install httpd

ではここからバーチャルホストの設定を行います。まずは3つの運用ホストそれぞれに対応するドキュメントルートディレクトリを作成しておきましょう:
# mkdir /var/www/html/vh1
# mkdir /var/www/html/vh2
# mkdir /var/www/html/vh3

次に Apache HTTPD サーバーの設定ファイルをカスタマイズします。/etc/httpd/conf/httpd.conf を編集して、サーバー名の指定があればコメントし、またバーチャルホストの有効化を指定します:
  :
#ServerName xxxxxx.com:80  ←ServerName をコメント
  :
  :
  :
NameVirtualHost *:80  ←NameVirtualHost のコメントを外してバーチャルホスト有効化
  :

そして各ホストや設定内容に合わせた設定ファイルを追加していきます。上記の設定 (2) を実現するための設定ファイルを /etc/httpd/conf.d/virtualhost-vh1.xxxxxx.com.conf として作成(新規追加)します。内容は以下のようにします:
(/etc/httpd/conf.d/virtualhost-vh1.xxxxxx.com.conf)
<VirtualHost *:80%>
  ServerName www1.xxxxxx.com
  DocumentRoot /var/www/html/vh1
  ErrorLog logs/vh1-error_log
  CustomLog logs/vh1-access_log combined env=!no_log
</VirtualHost>

この中で http://www1.xxxxxx.com/ でアクセスがあった場合のドキュメントルートが /var/www/html/vh1 であることや、HTTPD のエラーログ/アクセスログのファイル名を指定しています。

同様にして、上記設定 (3), (4) のための設定ファイルを /etc/httpd/conf.d/virtualhost-vh2.xxxxxx.com.conf と /etc/httpd/conf.d/virtualhost-vh3.xxxxxx.com.conf をそれぞれ以下の内容で新規に作成します:

(/etc/httpd/conf.d/virtualhost-vh2.xxxxxx.com.conf)
<VirtualHost *:80%>
  ServerName www2.xxxxxx.com
  DocumentRoot /var/www/html/vh2
  ErrorLog logs/vh2-error_log
  CustomLog logs/vh2-access_log combined env=!no_log
</VirtualHost>
(/etc/httpd/conf.d/virtualhost-vh3.xxxxxx.com.conf)
<VirtualHost *:80%>
  ServerName www3.xxxxxx.com
  DocumentRoot /var/www/html/vh3
  ErrorLog logs/vh3-error_log
  CustomLog logs/vh3-access_log combined env=!no_log
</VirtualHost>

最後に上記設定 (5) のための設定ファイルを追加します。ここではサーバー名でのアクセスがあった場合のみ適合するドキュメントルートを参照させていますが、IP アドレスを指定してアクセスがあった場合はエラーとするように決めています。その内容を設定するために以下の内容で /etc/httpd/conf.d/virtualhost-00.conf ファイルを新規に作成します:
(/etc/httpd/conf.d/virtualhost-00.conf)
<VirtualHost *:80%>
  ServerName any
  <Location>
    Order deny,all
    Deny from all
  </Location>
</VirtualHost>

これで設定準備そのものは完了です。最後の準備として動作確認用に3つのドキュメントルートそれぞれに簡単な index.html ファイルを作成して、バーチャルホストが有効になっていることががテスト時に分かるようにします:
# echo "VirtualHost 1" > /var/www/html/vh1/index.html

# echo "VirtualHost 2" > /var/www/html/vh2/index.html

# echo "VirtualHost 3" > /var/www/html/vh3/index.html

これで目的のバーチャルホストを実現するための準備は完了です。最後に Apache HTTPD を再起動して、この準備内容を反映させます:
# /etc/init.d/httpd restart

動作確認は(ホスト名で区別するので) www1.xxxxxx.com / www2.xxxxxx.com / www3.xxxxxx.com の名前でこのホストの IP アドレスが引ける環境から行う必要があります。上記のように /etc/hosts の 127.0.0.1 で設定したのであれば Apache HTTPD サーバーと同じマシンからブラウザを起動して行います。

まずは http://www1.xxxxxx.com/ の場合。ちゃんと期待通りの内容が表示できてます:
2014120901


同様にして http://www2.xxxxxx.com/ や http://www3.xxxxxx.com/ の場合もそれぞれ正しいドキュメントルートを参照できているはずです:
2014120902

2014120903


最後に http://localhost/ (或いはhttp://IPアドレス) でアクセスしてみます。localhost で HTTPD サーバーが動いていることは間違いないのですが、ホスト名で指定されていないので(上記 (5) の設定が有効になっているので)エラー扱いとなるはずです:
2014120904


バーチャルホスト(とDNS)をうまく使うと、負荷やリソースとの兼ね合いもありますが、1台のサーバーで複数の HTTP ホストを運用できて便利です。