46.4. 仮想ホスト

仮想ホストという用語は、同じ物理マシンで複数のURI (universal resource identifiers)のサービスを行えるApacheの機能を指しています。これは、www.example.comとwww.example.netのような複数のドメインを、1台の物理マシン上の単一のWebサーバで保持できることを意味しています。

管理の手間(1つのWebサーバを維持すればよい)とハードウェアの費用(ドメインごとの専用のサーバを必要としない)を省くために仮想ホストを使うことは、よく行われています。仮想ホストは名前ベース、IPベース、またはポートベースのいずれかになります。

仮想ホストを設定するには、YaSTを使うか(Default Host (デフォルトのホスト)を参照)、またはhttpd.confVirtual Hostセクションを手動で編集します(項46.3.2. 「Apacheを手動で設定する」を参照)。

SUSE LinuxのApacheは、デフォルトでは、/etc/apache2/vhosts.d/の仮想ホストごとに1つの設定ファイルを使用するようになっています。仮想ホストの基本的なテンプレートは、このディレクトリ内に用意されています(vhost.template)。仮想ホストの設定は、たとえば、1つのファイルに記述してから設定ファイルにインクルードするなど、他の方法でも追加できます。

[Important]重要項目

httpd2 -Sコマンドは、仮想ホストのセットアップをチェックするのにとても便利です。これは、Apacheが解釈している仮想ホストの設定を出力するので、期待したとおりの結果になっているかどうかを確認するのに役立ちます。Apacheに-DSSLのようなフラグを付けている場合には、テストの場合にも、httpd2 -S -DSSLのように同じフラグを付けることが必要です。

46.4.1. 名前ベースの仮想ホスト

名前ベースの仮想ホストでは、1つのIPアドレスで複数のWebサイトを運用することができます。Apacheは、クライアントから送られたHTTPヘッダのホストフィールドを使用して、要求を、仮想ホスト宣言の1つの、一致するServerNameエントリに結び付けます。一致するServerNameが見つからない場合には、指定されている最初のVirtualHostがデフォルトとして用いられます。

NameVirtualHostは、Apache設定のVirtual Hostセクションを開始します。

46.4.1.1. NameVirtualHost

NameVirtualHostは、Apache Webサーバに、どのIPアドレス、そしてオプションとしてどのポートをリスンして、HTTPヘッダ内にドメイン名を含むクライアントからのリクエストを受け付けるかを指定します。

最初の引数には完全修飾ドメイン名を指定することができますが、IPアドレスを使用することをお勧めします。2番目の引数はポートで、オプションです。デフォルトでは、ポート80が使用され、Listenディレクティブで設定されます(Network Device Selection (ネットワークデバイスの選択)を参照)。

ワイルドカード*は、IPアドレスとポート番号の両方で使用することができます。その場合、すべてのインタフェースでの要求を受け取ります。IPv6のアドレスは、角カッコの中に記述する必要があります。

例 46.8. 名前ベースのVirtualHostエントリの応用例

# NameVirtualHost IP-address[:Port]
NameVirtualHost 192.168.1.100:80
NameVirtualHost 192.168.1.100
NameVirtualHost *:80
NameVirtualHost *
NameVirtualHost [2002:c0a8:164::]:80
                

46.4.1.2. 名前ベースのコンテキストでの<VirtualHost></VirtualHost>

<VirtualHost></VirtualHost>ブロックには、特定のドメインに適用される情報を記述します。Apacheは、クライアントから定義済みのVirtualHostへの要求を受け取ると、このセクションに記述されているディレクティブを使用します。ここには、VirtualHostコンテキストで許可されている、すべてのApacheディレクティブを使用することができます。VirtualHost開始タグは、名前ベースの仮想ホストの設定では、次の引数を受け付けます。

  • NameVirtualHostディレクティブで以前に宣言されたIPアドレス(または完全修飾ドメイン名)。

  • NameVirtualHostディレクティブで以前に宣言された、オプションのポート番号。

ワイルドカード*をIPアドレスの代わりに使うこともできます。この構文は、ワイルドカードをNameVirtualHost *として組み合わせて使用する場合にのみ有効です。IPv6アドレスを使用する場合には、アドレスを角カッコの中に記述することが必要です。

例 46.9. 名前ベースのVirtualHostディレクティブ

<VirtualHost 192.168.1.100:80>
    ServerName www.example.com
    DocumentRoot /srv/www/htdocs/example.com
    ServerAdmin webmaster@example.com
    ErrorLog /var/log/apache2/www.example.com-error_log
    CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>

<VirtualHost 192.168.1.100:80>
    ServerName www.example.net
    DocumentRoot /srv/www/htdocs/example.net
    ServerAdmin webmaster@example.net
    ErrorLog /var/log/apache2/www.example.net-error_log
    CustomLog /var/log/apache2/www.example.net-access_log common
</VirtualHost>

<VirtualHost [2002:c0a8:164::]>
    # 2002:c0a8:164:: is the IPv6 equivalent to 192.168.1.100
    ServerName www.example.org
    DocumentRoot /srv/www/htdocs/example.org
    ServerAdmin webmaster@example.org
    ErrorLog /var/log/apache2/www.example.org-error_log
    CustomLog /var/log/apache2/www.example.org-access_log common
</VirtualHost>
                

この例では、ドメインdomain www.example.comとwww.example.netは両方とも、IPアドレス192.168.1.100のマシンでホストされています。最初のVirtualHostが、Webサーバに送られてくるすべての要求に対するデフォルトとなります。

ディレクティブErrorLog (項46.3.2.3.4. 「ErrorLog file | "|command"を参照)とCustomLog(http://httpd.apache.org/docs-2.0/mod/mod_log_config.html#customlogを参照)では、ドメイン名を含める必要はありません。ここでは、自由に名前を選択できます。

46.4.2. IPベースの仮想ホスト

この仮想ホスト設定では、1つのコンピュータに対して複数のIPアドレスを設定する必要があります。Apacheの1つのインスタンスが、複数のドメインにホストとしてサービスを提供し、各ドメインに別のIPアドレスが割り当てられることになります。

[Important]IPアドレスとIPベースの仮想ホスト

物理サーバは、IPベースの仮想ホストごとに、1つのIPアドレスを持つ必要があります。マシンに複数のネットワークカードがない場合には、仮想ネットワークインタフェース(IPエイリアス)を使用することもできます。

46.4.2.1. IPエイリアスの設定

Apacheで複数のIPアドレスにサービスを提供するには、使用するコンピュータが複数のIPアドレスに対する要求を受け付ける必要があります。これをマルチIPホスティングと呼びます。加えて、カーネルでIPエイリアスを有効にする必要があります。これは、SUSE Linuxのデフォルトの設定です。

カーネルでIPエイリアスを設定すると、コマンドifconfigrouteを使用して、ホスト上に追加のIPアドレスが設定されます。これらのコマンドは、rootユーザで実行する必要があります。

次の例では、ホストのネットワークデバイスeth0にはすでにIP 192.168.0.10が割り当てられているものとします。コマンドifconfigを実行してホストのIPアドレスを確認します。また、次のコマンドでさらにIPアドレスを追加できます。

ip addr add 192.168.0.20/24 dev eth0
ip addr add 192.168.0.30/24 dev eth0
            

これらのIPアドレスはすべて、同じ物理ネットワークデバイス(eth0)に割り当てられています。

46.4.2.2. IPベースのコンテキストでの<VirtualHost></VirtualHost>

いったんIPエイリアスをシステムに設定するか、ホストに複数のネットワークカードを装着すれば、Apacheが設定可能になります。すべての仮想サーバについて、VirtualHostブロックが個別に必要です。

次の例では、IP 192.168.1.10のマシンでApacheが実行されており、付加的なIP 192.168.0.20および192.168.0.30をホストしています。IPアドレス192.168.0.0192.168.0.255は公共のインターネットにルーティングされないので、この例はプライベートネットワークでのみ使用できます。

例 46.10. IPベースのVirtualHostディレクティブ

<VirtualHost 192.168.0.20>
    ServerName www.example.com
    DocumentRoot /srv/www/htdocs/example.com
    ServerAdmin webmaster@example.com
    ErrorLog /var/log/apache2/www.example.com-error_log
    CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>

<VirtualHost 192.168.0.30>
    ServerName www.example.net
    DocumentRoot /srv/www/htdocs/example.net
    ServerAdmin tux@example.net
    ErrorLog /var/log/apache2/www.example.net-error_log
    CustomLog /var/log/apache2/www.example.net-access_log common
</VirtualHost>
                

ここでは、VirtualHostディレクティブは、192.168.0.10以外のインタフェースに対してのみ指定されています。Listenディレクティブ(Network Device Selection (ネットワークデバイスの選択)を参照)を192.168.0.10に対しても設定する場合には、そのインタフェースへのHTTPリクエストに応答する別個のIPベースの仮想ホストを作成する必要があります。そうでなければ、/etc/apache2/httpd.conf (項46.3.2.3. 「/etc/apache2/httpd.conf内のApacheのディレクティブ: Main Server 」を参照)のMain Serverセクションにあるディレクティブが適用されます。