株式会社ロジステック株式会社ロジステック

By logistech

Virtual Host サポート

関連事項:
Non-IP based virtual hosts

バーチャルホストとは?

たとえばあるインターネットサービスプロバイダが、smallcobaygroup というそれぞれ異なった組織のためにWebスペースを供給する www.serve.com という名のマシンを持っていると仮定します。普通はこれらのグループには www.serve.com のWebツリー上の一部が割り当てられます。結果、smallcoのホームページは次のようなURLになるでしょうし

http://www.serve.com/smallco/

また、baygroupのホームページは次のようなURLになります。

http://www.serve.com/baygroup/

しかし、美的感覚からいえば、両組織とも自分達のホームページがサービスプロバイダの名前の後ろにくっついたかたちになって呼出されるより独自の名前で呼出される方がいいでしょう。;ところが彼ら組織は、インターネット接続やサーバのセットアップを自分達ではしたくありません。

バーチャルホストはこの問題への解決策です。smallco と baygroup は、それぞれ
www.smallco.comwww.baygroup.orgという独自の
インターネットに登録した名前を持っているとします。これらのホスト名は両方とも
サービスプロバイダのマシン(www.serve.com)に対応しています。
これで、smallcoのホームページは今、次のURLになり、

http://www.smallco.com/

そして、baygroupはのホームページは、次のURLになります。

http://www.baygroup.org/

必要なシステム

HTTP/1.0プロトコルの制限で、WEBサーバーは各々のバーチャルホストに対して唯一のIPアドレスを持たなければなりません。それには、マシンが複数の物理的なネットワークコネクションを持つか、または、いくつかのOS上で実現されている仮想インターフェース(virtual interface)を使用すれば可能です。

Apacheのセットアップのしかた

マルチホストをサポートするためにApacheを構成する方法は2つあります。
1つは各々のホスト用に別個のhttpdデーモンを走らせる方法、もう一つはすべてのバーチャルホストをサポートする1個のデーモンを走らせる方法です。

マルチデーモンを使うとき:

  • 異なるバーチャルホスト間では、httpdの構成がかなり違います。たとえば、
    ServerType,
    User,
    Group,
    TypesConfig または
    ServerRoot
    の値がそれぞれ違うというように。

  • マシンのリクエスト処理はあまり多くはありません。

シングルデーモンを使うとき:

  • バーチャルホスト間でhttpdの構成が共有されます。
  • マシンは多くのリクエストに対応することになり、そして、動作している個々のデーモンでのパフォーマンスのロスが重要になります。

マルチデーモンのセットアップ

各々のバーチャルホストごとに別個のhttpdをインストール。
個々のインストレーションでは、デーモンがどのIPアドレス(またはバーチャルホスト)に対しサービスするかを決めるためのバインドアドレス(BindAddress)指定をコンフィグレーションファイルの中で設定します。

例.

BindAddress www.smallco.com

このホスト名はまたIPアドレスの代わりにもなります。

シングルデーモンのセットアップ

このケースの場合、一つのhttpdがすべてのバーチャルホストのリクエストに応えます。
コンフィグレーションファイルの中でのバーチャルホスト(VirtualHost)の指定は、
ServerAdmin,
ServerName,
DocumentRoot,
ErrorLog
TransferLog 構成の値を個々のバーチャルホストに対応した値にセットするために使用されます。

例.


<VirtualHost www.smallco.com>
ServerAdmin webmaster@mail.smallco.com
DocumentRoot /groups/smallco/www
ServerName www.smallco.com
ErrorLog /groups/smallco/logs/error_log
TransferLog /groups/smallco/logs/access_log
</VirtualHost>

<VirtualHost www.baygroup.org>
ServerAdmin webmaster@mail.baygroup.org
DocumentRoot /groups/baygroup/www
ServerName www.baygroup.org
ErrorLog /groups/baygroup/logs/error_log
TransferLog /groups/baygroup/logs/access_log
</VirtualHost>

このバーチャルホスト名はまたIPアドレスの代わりにもなります。


ServerType,
User,
Group,
StartServers,
MaxSpareServers,
MinSpareServers,
MaxRequestsPerChild,
BindAddress,
PidFile,
TypesConfig
ServerRoot
を除いて、ほとんどのコンフィグレーション指定をバーチャルホスト設定欄に書けます。

セキュリティ: どこにログファイルを書くかを記述するときは、もしもApacheをスタートさせたユーザー以外のだれかが、それらが書かれたディレクトリへの書き込みアクセスを行ったときに表出するいくつかのセキュリティ上の危険に注意すべきです。
詳細はセキュリティ情報(security tips)を見てください。

ファイルハンドル/リソース制限:


多くの数のバーチャルホストを使用するとき、もし各々のバーチャルホストが異なったログファイル記述すればApacheは有効なファイルディスクリプタを使い果たします。Apacheで使用されるファイル記述子の総数は、それぞれ異なったエラーログファイルごとに1つとすべての他のログファイル指定のための1つに加え、プラス内部用に使用される10-20個です。Unixオペレーティングシステムはプロセスで使用されるであろうファイル記述子の数を制限しています。制限は通常64個、一般的にはその数を増やすのはハードによる制限にかかってくるでしょう。

Apacheは要求時に制限数を増やすことを試みますが、次の場合にはそのようには働きません。:

  1. あなたのシステムがsetrlimit()システムコールを備えていない場合。
  2. setrlimit(RLIMIT_NOFILE)コールがあなたのシステム上で機能しない場合(Solaris 2.3のように)
  3. ファイルディスクリプタの要求数がハードの制限を超えた場合。
  4. あなたのシステムがファイルディスクリプタ上の他の制限を設けた場合。たとえば、スタンダードI/O上でのファイルディスクリプタの使用を256個以下に制限した場合のように。

問題発生時への対処:

  • ログファイルの数を減少させる; メインログファイルのログを除いてバーチャルホストの欄にログファイルを記述しない。
  • もしあなたのシステムが上記の1または2に該当する場合は、Apacheをスタートさせる前にファイルディスクリプタの制限を大きくする。
    次のようなスクリプトを使って、


    #!/bin/sh
    ulimit -S -n 100
    exec httpd

Apacheがルートプロセス用に割り当てられたリソースを使い果たし始めるという報告があります。これは “unable to fork”のようにエラーログの中でそれ自身をエラーとして見せます。これを引き上げる方法が2つあります。:


  1. httpdのまわりのcshスクリプトラッパーで”rlimit” を 512のような大きい数にセットします。
  2. http_main.c を main()からsetrlimit()を呼出しするように修正します。rlimit構造体の間に

    struct rlimit rlp;

    rlp.rlim_cur = rlp.rlim_max = 512;
    if (setrlimit(RLIMIT_NPROC, &rlp)) {
    fprintf(stderr, “setrlimit(RLIMIT_NPROC) failed.\n”);
    exit(1);
    }


    (“Aaron Gifford <agifford@InfoWest.COM>” のパッチに感謝します。)

後者はおそらくApacheの今後のバージョンでクリアになるでしょう。


logistech
About logistech