大橋のページ

Apacheメモ

Apacheの標準的なインストール
configureスクリプトのヘルプ
ログファイルの分析 wwwstat
ログファイルの分析 Web Statistics
ログファイルの分析 SiteServerExpress 1
ログファイルの分析 SiteServerExpress 2
potatoのインストールと運用
バーチャルホストの設定

Virtual Hostの設定

IPベースでVirtual Hostを設定する

Apacheのバーチャルホストでは、名前ベースのものとIPベースのものとがあります。名前ベースとはDNSサーバのCNAMEレコードを使って、別のホスト名を「あだ名」として割り当ててバーチャルホストを実現する方法で、たとえば「www.hyperdyne.co.jp」に「home.hyperdyne.co.jp」(www.dokokano.co.jpというような別のドメインの名前でも可能です)という別名を与え、それぞれでApacheのルートディレクトリを違うものにする方法です。

一見簡単そうですが、実際にやってみると、なかなかめんどうです。実際の設定は、

NameVirtualHost 210.160.79.105

<VirtualHost 210.160.79.105>  <-- IPアドレスで指定する
ServerAdmin webmaster@hyperdyne.co.jp
DocumentRoot /home/httpd/htdocs/primary
ServerName www.hyperdyne.co.jp
ErrorLog /var/log/httpd/hyperdyne-error_log
TransferLog /var/log/httpd/hyperdyne-access_log
</VirtualHost>

<VirtualHost 210.160.79.105>
ServerAdmin webmaster@hyperdyne.co.jp
DocumentRoot /home/httpd/htdocs/virtual1
ServerName www.virtual1.co.jp
ErrorLog /var/log/httpd/virtual1-error_log
TransferLog /var/log/httpd/virtual1-access_log
</VirtualHost>

<VirtualHost 210.160.79.105>
ServerAdmin webmaster@hyperdyne.co.jp
DocumentRoot /home/httpd/htdocs/virtual2
ServerName www.virtual2.co.jp
ErrorLog /var/log/httpd/virtual2-error_log
TransferLog /var/log/httpd/virtual2-access_log
</VirtualHost>

というような設定になります。メイン(www.hyperdyne.co.jp)のホストもバーチャルホストとしてしまい、そのほか「www.virtual.co.jp」「www.virtual2.cp.jp」のふたつのバーチャルホストとあわせて、3つのホストがひとつのIPアドレスに割り当てられることになりますが、これが効果を発揮するのは、HTTP 1.1対応のブラウザだけなのです。HTTP 1.0のブラウザは、「www.virtual1.co.jp」に接続しているつもりで、IPアドレス210.160.79.105に接続してきて、結果的に「www.hyperdyne.co.jp」に接続してきます。

HTTP 1.0対応のブラウザというとずいぶん古いブラウザのように思えますが、実際にはプロキシを経由して接続してきた場合には、プロキシが対応しているHTTPのバージョンで接続してくるため、ユーザの手元にあるブラウザのバージョンは無関係ということが多く、ログを調べたかぎりでは、半分弱がHTTP 1.0による接続になっています。

Apacheのマニュアルなどもその点を配慮して、「ServerPath」を使う方法などを説明しています。しかし、HTTP 1.0のブラウザからの接続には、最終的にはプライマリのホストに、その他のバーチャルホストにリンクしたペ−ジを置く以外の手段は説明していません。

(この部分追加 接続先が名前ベースのものか、IPベースのものかは、プロキシを経由しない状態(またはHTTP 1.1対応のプロキシ経由)で、たとえばIEなら「ツール」メニュー−「インターネットオプション」−「詳細設定」の「HTTP 1.1設定」で「HTTP 1.1を使用する」のチェックをはずしてみるとHTTP 1.0で接続していることになります。接続した状態でドキュメントルート(http://www.hyperdyne.co.jp/のようにディレクトリのない、一番上)を指定したときにどうなるかで判断できます。

逆に言えば、 http://www.virtual1.co.jp/virtual1/
http://www.virtual2.co.jp/virtual2/

のように、すべてのバーチャルホストのドキュメントをかならず、一意のディレクトリの下に置くようにすれば、ディレクトリ付のURLで接続してくるため、そのディレクトリ名からホストを識別することができるようになります。この方法でもHTTP 1.0対応ブラウザでルートを指定されると、プライマリホストのルートが読み込まれてしまうため、各バーチャルホストへのリンクページを置いてクリックしてもらうようにします。)

IPベースによるバーチャルホストでは、複数のネットワークインタフェースが必要になります。理想を言えば、複数枚のネットワークインタフェースをマシンに装着することになりますが、Linuxなどには1台のマシンの1つのネットワークカードに複数のIPアドレスを割り当てることができるようになっています。IPアドレスに別名を与えることから、IPエイリアスと言います。

WindowsNTではこれが非常に簡単にできるのですが、Linuxでは場合によっては非常にめんどうです。第一にカーネルがIPエイリアスをサポートしている必要があります。最近のLinuxパッケージでは、もともとIPエイリアスをサポートしたカーネルになっているようですが、確認しましょう。また、カーネルでサポートするといっても、カーネル自体に組み込む方法とモジュールとして組み込む方法があります。RedHatでは、モジュールは、「/lib/modules/2.0.34/ipv4/」にあります。

カーネルがIPエイリアスをサポートするようになったら、ifconfigコマンドでIPアドレスを割り当てます。割り当てるには、

# /sbin/ifconfig eth1:0 210.160.79.xxx

とします。ifconfigのあとは、エイリアスを割り当てたいインタフェースの名前(1枚目はeth0、2枚目はeth1。ここでは2枚目に割り当てている)+「:0」のあとに、半角スペースを入れて、エイリアスとして割り当てるIPアドレス(ここでは210.160.79.xxx。xxxは実際のIPアドレスにします)を入力します。

また、OCN接続などクラスC未満で、ネットマスクを指定するときは、

# /sbin/ifconfig eth1:0 210.160.79.xxx netmask 255.255.255.240

のように「netmask」に続けて、半角スペースのあとにサブネットマスクを入力します。

同じように、ブロードキャストアドレスを設定するときは、

# /sbin/ifconfig eth1:0 210.160.79.xxx netmask 255.255.255.240 broadcast 210.160.79.111

のように「broacast」に続けて、半角スペースのあとにブロードキャストアドレスを入力します。

続いて、ルーティングの設定をrouteコマンドで行ないます。

# route add -host 210.160.79.xxx dev eth1:0

「route add」(routeコマンドを使ってルーティングテーブルに書き加える)のあとは、「-host」に続けて、割り当てたIPアドレスへのパケットは、「dev eth1:」(デバイスの「eth1:0」へ、とします。IPアドレスと「eth1:0」の部分はそれぞれ先に設定したものを使います。エイリアスのIPにpingコマンドを使って、かえってくれば設定は正常に行なわれています。

IPアドレスの設定が無事なようなら、今度はDNSサーバにエイリアスのIPアドレスとホスト名を登録します。

new     IN A    210.160.79.xxx

を正引き設定ファイルに、

xxx     IN PTR   new.hyperdyne.co.jp.

を逆引き設定ファイルに書き加えて、DNSサーバ(BIND)を再起動します。

# /etc/rc.d/init.d/named stop
# /etc/rc.d/init.d/named start

名前でpingしてみます。「ping new」として新しいホスト名にpingしてみます。かえってくるようなら、IPアドレス、ホスト名とも正常に認識されています。

これまでのままでは、起動してから手動でifconfigコマンドとrouteコマンドでIPエイリアスを組み込まなければならないため、起動時にIPエイリアスが実行されるように「/etc/rc.d/rc.local」に「ifconfig」と「route」コマンド行を書き加えます。そのあと、Linuxを再起動してみて、正常に組み込まれているかテストします。

Apache側を設定する

Apache側のバーチャルホストは、「httpd.conf」にバーチャルホストの設定します。viを起動して、httpd.confを編集します。

# vi /etc/httpd/conf/httpd.conf

まず、次の個所を修正します。

# BindAddress: You can support virtual hosts with this option. This option
# is used to tell the server which IP address to listen to. It can either
# contain "*", an IP address, or a fully qualified Internet domain name.
# See also the VirtualHost directive.

#BindAddress * 

「#BindAddress *」はApacheが応答するパケットのIPアドレスを指定する個所です。無効になっていますから「#」を削除します。
(この部分ちょっと不明です。無効のままでも応答できているような....)

続いてもっとも重要な個所です。httpd.confの一番最後の個所を修正します。


ServerAdmin webmaster@hyperdyne.co.jp
DocumentRoot /home/virtual
ServerName new.hyperdyne.co.jp
ErrorLog /var/log/httpd/search-error_log
TransferLog /var/log/httpd/search-access_log

「<VirtualHost 210.160.79.100>」のところには、「<VirtualHost」と半角スペースに続けてIPアドレスかホスト名を入力します。IPアドレスのほうが確実です。「DocumentRoot」がバーチャルホストのルートディレクトリの設定、「ServerName」がホスト名、「ErrorLog」「TransferLog」がログの設定です。ログはなければ勝手に作られます。

ルータの設定でHTTPパケットを制限しているときは、バーチャルホストのIPアドレスにも届くようフィルタを設定します。

logrotateを設定する

最後にログがlogrotateによって1週間ごとに切り替わるようにします。「/etc/logrotate.d/」にある「apache」をエディタで編集します。

/var/log/httpd/access_log {
    postrotate
        /usr/bin/killall -HUP httpd
    endscript
}

/var/log/httpd/agent_log {
    postrotate
        /usr/bin/killall -HUP httpd
    endscript
}

/var/log/httpd/error_log {
    postrotate
        /usr/bin/killall -HUP httpd
    endscript
}

/var/log/httpd/referer_log {
    postrotate
        /usr/bin/killall -HUP httpd
    endscript
}

に、書き加えます。


/var/log/httpd/search-error_log {
    postrotate
        /usr/bin/killall -HUP httpd
    endscript
}
/var/log/httpd/search-access_log {
    postrotate
       /usr/bin/killall -HUP httpd
    endscript
}

著作権、商標等について (C) 1999 HyperDyne Inc.