Apache - 仮想ホスト

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

1台のサーバを使って複数のドメイン名を使ったWebサーバとしての機能を提供する方法を記載する。
サーバが複数のインターフェースを持っていて、IPアドレスが複数割り当て可能な場合と、1つのIPアドレスでホスト名を見て振り分ける方法がある。


IPベースの仮想ホスト

IPベースとは、1台のサーバに複数のネットワークインターフェースカード(NIC)が付いていて別々のIPアドレスを持っている場合に、
それぞれのIPアドレスに対して仮想ホストを割り当てる。

IPベースの仮想ホストを割り当てる場合には、VirtualHostを使う。

 <VirtualHost IPアドレス1:ポート番号>
    ...
    ,,,
 </VirtualHost>
 
 <VirtualHost IPアドレス2:ポート番号>
    ...
    ...
 </VirtualHost>


より具体的に記載する。 例として、192.168.1.5と192.168.1.6という2つのIPアドレスが割り当てられているとする。
そして、DNSに対して、wwww.adminweb.jpを192.168.1.5に、www.officepro.jpを192.168.1.6を登録する。

1つのApacheで2つのホストに対する設定を行う場合は、httpd.confファイルに次のように記述する。
Apache2.2以降では、httpd.confではなく、http-vhosts.confに記述する。詳細は、下記の名前ベースの仮想ホストを参照すること。

 <VirtualHost 192.168.1.5:80>
    ServerName     www.adminweb.jp
    ServerAdmin    hogehoge@adminweb.jp
    DocumentRoot   "/var/www/html/adminweb_docs"
    CustomLog      logs/adminweb.access.log common
    ErrorLog       logs/adminweb.error.log
 </VirtualHost>
 
 <VirtualHost 192.168.1.6:80>
    ServerName     www.officepro.jp
    ServerAdmin    hogehoge@officepro.jp
    DocumentRoot   "/var/www/html/officepro_docs"
    CustomLog      logs/officepro.access.log common
    ErrorLog       logs/officepro.error.log
 </VirtualHost>


IPアドレス毎に必要な設定を記述する。
例えば、www.adminweb.jpにアクセスがあった場合は、192.168.1.5に記述された設定が有効となるため、
ドキュメントルート/var/www/html/adminweb_docs直下にあるコンテンツが返される。

VirtualHostごとに個別の設定を記述できるので、必要な設定を記述しておく。
最低限上記に記述したようなServerNameやDocumentRoot、そしてログ関係は個別に設定する。
その他の設定は、共通した設定にしても構わない。

その他にも各ドキュメントルートへのアクセス権限の設定などが必要である。
実際の設定例は、名前ベースの仮想ホストを参照する。


名前ベースの仮想ホスト

名前ベースの仮想ホストは、1つのIPアドレスで、クライアントからのリクエストに含まれるHostsヘッダを見てどのホストへアクセスするのかを判断する。

Apacheの設定

まず、アクセス先のIPアドレスに対して、名前ベースの仮想ホストを設定していることを表すために、NameVirtualHostを設定する。
IPアドレスを固定で指定するか、または1つだけしかIPアドレスが無い場合には*を記述しても構わない。
*は、サーバに対する全てのIPアドレスと言う意味になる。

# 記述方法
NameVirtualHost IPアドレス:ポート番号

# 実際の設定例
NameVirtualHost 192.168.1.5:80
または
NameVirtualHost *:80


次に、VirtualHostを使用して、ServerNameごとに個別の設定を記述する。
リクエストに含まれるHostsヘッダを参照し、ServerNameと一致するブロックを探す。
一致したブロックが見つかった場合にはそのブロック内の設定が適用される。

 <VirtualHost IPアドレス:ポート番号>
    ServerName   wwww.adminweb.jp
    ....
 </VirtualHost>
 
 <VirtualHost IPアドレス:ポート番号>
    ServerName   www.officepro.jp
    ....
 </VirtualHost>


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

※注意
下記で、*:80となっている箇所は、192.168.1.5:80と明示的にIPアドレスを指定しても構わない。

 NameVirtualHost *:80
 
 <VirtualHost *:80>
    ServerName     www.adminweb.jp
    ServerAdmin    hogehoge@adminweb.jp
    DocumentRoot   "/var/www/html/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   "/var/www/html/officepro_docs"
    CustomLog      logs/officepro.access.log common
    ErrorLog       logs/officepro.error.log
 </VirtualHost>


DNSの設定

まず、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行目付近に記述がある)
Includeの先頭に記述されている#を外して、httpd-vhosts.confを読み込むように設定する。

 # 変更前
 # Virtual hosts
 #Include conf/extra/httpd-vhosts.conf
 
 # 変更後
 # Virtual hosts
 Include conf/extra/httpd-vhosts.conf


次に、httpd-vhosts.confファイルを編集する。(Apacheをインストールしたディレクトリ¥conf¥extraにある)
次のような記述がサンプルとして記述されている。(コメント行は省略している)
ここでは、次のように記述を変更する。

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

 # 変更前
 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>


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

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

 <Directory "/var/www/html/adminweb_docs">
    Order allow,deny
    Allow from all
 </Directory>
 
 <Directory /var/www/html/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を使用して、複数のドメインを使ったホストに対して別々のページを返すことが出来るようになる。


仮想ホストのエイリアスの設定

名前ベースの仮想ホストの設定が行われている時に、登録されてないホスト名でのアクセスがあった場合を考える。

例えば、DNS(またはhostsファイル)にて以下の設定がされていたとする。

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


それに対して、仮想ホストの設定が、www.adminweb.jpとwww.officepro.jpにしか行われていなかったとする。

 NameVirtualHost *:80
 
 <VirtualHost *:80>
    ServerAdmin dumy@adminweb.jp
    DocumentRoot "/var/www/html/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 "/var/www/html/officepro_docs"
    ServerName www.officepro.jp
    CustomLog logs/officepro.access.log common
    ErrorLog logs/officepro.error.log
 </VirtualHost>


この時、http://localhost/ に対してアクセスがあった場合、最初に登録されている仮想ホストの設定がデフォルトとして適用される。

このような場合、仮想ホストの設定が行われていないホストに対して、デフォルト以外のホストの設定を適用させることが可能である。
ServerAliasを使用して、仮想ホストの設定に別名として登録する。
複数のホスト名を登録したい場合は、空白で区切って続けて記述する。

# 記述方法
ServerAlias ホスト名1 ホスト名2 ...


http://localhost/ に対するアクセスをwww.officepro.jpの設定が適用されるように、www.officepro.jpに別名としてlocalhostを登録する。

 NameVirtualHost *:80
 
 <VirtualHost *:80>
    ServerAdmin dumy@adminweb.jp
    DocumentRoot "/var/www/html/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 "/var/www/html/officepro_docs"
    ServerName www.officepro.jp
    ServerAlias localhost
    CustomLog logs/officepro.access.log common
    ErrorLog logs/officepro.error.log
 </VirtualHost>


Apacheを再起動して、http://localhost/ にアクセスする。
エイリアスで設定が行われた www.officepro.jp の設定が適用されていることを確認する。