バーチャルホスト(別名:仮想ホスト、英名:Virtual host)は、図のように1台の物理サーバーに対して複数のドメイン名を割り当てることで、 利用者からみるとドメイン名別にあたかも(このあたかもが仮想です。)それぞれのドメイン1つに対して物理サーバーがあるように管理する技術です。
バーチャルホストの方式は、大きく分けて2つの方法があります。
上記概要図の例では1つのIPアドレス(NICが1つ)に対して2つのドメイン名を割り当てているので名前ベースです。 対して、IPベースバーチャルホストは、1台の物理サーバーに複数のNICを搭載して複数のIPアドレスを割り当てます。 割り当てられたIPアドレスから個別のドメイン名を判定します。
このように高価な物理サーバーの資源を複数の仮想ホストでそれぞれ有効活用することが目的です。
Host要素は仮想ホストを表します。仮想ホストは、サーバー(「www.mycompany.com」など)のネットワーク名と、Tomcatが実行されている特定のサーバーとの関連付けです。
クライアントがネットワーク名を使用してTomcatサーバーに接続できるようにするには、所属するインターネットドメインを管理するドメインネームサービス(DNS)サーバーにこの名前を登録する必要があります。
多くの場合、システム管理者は、複数のネットワーク名(www.mycompany.comやcompany.comなど)を同じ仮想ホストとアプリケーションに関連付けることを望みます。
これは、以下で説明するホスト名エイリアス機能を使用して実行できます。
1つまたは複数のHost要素がEngine要素内にネストされています。 Host要素内で、この仮想ホストに関連付けられたWebアプリケーションのコンテキスト要素をネストできます。
各エンジンに関連付けられたホストの1つが、そのエンジンのdefaultHost属性に一致する名前を持っていなければなりません。
クライアントは通常、ホスト名を使用して、接続先のサーバーを識別します。このホスト名は、HTTP要求ヘッダーにも含まれています。
TomcatはHTTPヘッダーからホスト名を抽出し、一致する名前のHostを探します。一致するものが見つからない場合、要求はデフォルトのホストにルーティングされます。
DNS名がHost要素の名前と一致しない要求がデフォルトのホストにルーティングされるため、デフォルトホストの名前はDNS名と一致する必要はありません(DNS名と一致する必要はありません)。
以下の説明では、変数名$CATALINA_BASEを使用して、相対パスのほとんどが解決されているベースディレクトリを参照しています。
CATALINA_BASEディレクトリを設定して複数のインスタンスに対してTomcatを設定していない場合、
$CATALINA_BASEはTomcatをインストールしたディレクトリ$CATALINA_HOMEの値に設定されます。
Hostのすべての実装では、次の属性がサポートされています。
属性 | 未指定時の デフォルト値 |
説明 |
---|---|---|
appBase | webapps | この仮想ホストのwebアプリケーション(*.warファイル)を格納するディレクトリのパス名です。 絶対パス名、または$CATALINA_BASEディレクトリに対する相対パス名を指定できます。 Webアプリケーションの自動認識と配備の詳細については、「アプリケーションの自動デプロイメント」を参照してください。 |
xmlBase | null | この仮想ホストのXMLベースディレクトリ。 これは、この仮想ホストにデプロイするコンテキストXML記述子を含む可能性のあるディレクトリのパス名です。 このディレクトリの絶対パス名、または$ CATALINA_BASEディレクトリを基準とするパス名を指定できます。 Webアプリケーションの自動認識と配備の詳細については、「アプリケーションの自動デプロイメント」を参照してください。 指定されていない場合、デフォルトのconf/ |
createDirs | true | trueに設定すると、Tomcatは起動時にappBase属性とxmlBase属性で定義されたディレクトリを作成しようとします。 true設定時にディレクトリの作成に失敗すると、エラーメッセージが出力されますが、起動シーケンスは停止しません。 |
autoDeploy | true | この値は、Tomcat実行時に新しいWebアプリケーション(*.war)又は更新されたWebアプリケーションの更新を許可するかの判定値です。 trueに設定した場合には、TomcatはappBase及びxmlBaseディレクトリを定期的にチェックし、新しいWebアプリケーション又は、コンテキストXML記述子が存在した場合には、 対象のWebアプリケーションをデプロイします。更新されたWebアプリケーションまたはコンテキストXML記述子は、Webアプリケーションのリロードをします。 詳細は、「アプリケーションの自動デプロイメント」を参照してください。 |
backgroundProcessorDelay | -1 | この値は、このホスト上のbackgroundProcessメソッドの呼び出しとすべてのコンテキストを含む子コンテナの呼び出しの間の遅延を秒単位で表します。 子コンテナは、遅延値が負でない場合(つまり、独自の処理スレッドを使用している場合)、呼び出されません。 これを正の値に設定すると、スレッドが生成されます。 指定された時間待機すると、スレッドはこのホストとそのすべての子コンテナでbackgroundProcessメソッドを呼び出します。 ホストはバックグラウンド処理を使用して、ライブWebアプリケーションデプロイメント関連のタスクを実行します。 指定しない場合、この属性のデフォルト値は-1です。つまり、ホストは親エンジンのバックグラウンド処理スレッドに依存します。 |
className | org.apache.catalina.core. StandardHost |
使用する実装のJavaクラス名。このクラスは、org.apache.catalina.Hostインタフェースを実装する必要があります。 指定されていない場合は、org.apache.catalina.core.StandardHostが使用されます。 |
deployIgnore | null | autoDeployおよびdeployOnStartupが設定されているときに無視するパスを定義する正規表現。 これにより、たとえばバージョン管理システムで設定を保持し、appBaseにある.svnまたはCVSフォルダを展開することはできません。 この正規表現はappBaseを基準にしています。また、ファイル/ディレクトリ名全体に対してマッチが実行されることを意味します。 したがって、fooはfooという名前のファイルまたはディレクトリのみと一致しますが、foo.war、foobar、またはmyfooappは一致しません。 "foo"と何かをマッチさせるには、。* foo。*を使うことができます。 詳細は、「アプリケーションの自動デプロイメント」を参照してください。 (筆者記入)バージョン管理システムから直接チェックアウトを想定した例を原文は示していますが、 日本のシステムでは、商用環境に無用なファイルは置かないのが鉄則です。この属性を利用する事はないでしょう。 |
deployOnStartup | true | このフラグ値は、Tomcat起動時にこのホストのWebアプリケーションを自動的にデプロイするかどうかを示します。 詳細は、「アプリケーションの自動デプロイメント」を参照してください。 |
failCtxIfServletStartFails | false | load-on-startup >= 0 のサーブレットのいずれかが自身の起動に失敗した場合、各子コンテキストが起動に失敗するようにするには、trueに設定します。 各子コンテキストはこの属性をオーバーライドできます。 |
name | null | 通常、この仮想ホストのネットワーク名は、ドメインネームサービスサーバーに登録されています。 ホスト名を指定する場合にかかわらず、Tomcatは内部で小文字に変換します。 エンジン内にネストされたホストの1つは、そのエンジンのdefaultHost設定と一致する名前を持っていなければなりません。 同じ仮想ホストに複数のネットワーク名を割り当てる方法については、「ホスト名エイリアス」を参照してください。 *.domainname(*.apache.orgなど)の形式をとっている場合は、名前が正確に一致するホストが見つからない限り、 そのドメイン内のすべてのホストとの一致として扱われます。 |
startStopThreads | 1 | このホストが子コンテキスト要素を並列に開始するために使用するスレッドの数。 自動デプロイメントが使用されている場合、同じスレッドプールが新しいコンテキストをデプロイするために使用されます。 特別な値0は、使用されるRuntime.getRuntime()。availableProcessors()の値になります。 負の値はRuntime.getRuntime()になります。これが1未満の場合を除いて、availableProcessors() + 指定値が使用されます。 この場合、1スレッドが使用されます。指定しない場合は、デフォルト値の1が使用されます。 |
undeployOldVersions | false | このフラグは、自動デプロイメントプロセスの一部であるTomcatが、 パラレルデプロイメントを使用してデプロイされた古いWebアプリケーションの未使用バージョンをチェックし、見つかった場合は削除します。 このフラグは、autoDeployがtrueの場合にのみ適用されます。指定されていない場合は、デフォルト値のfalseが使用されます。 |
Hostの標準実装はorg.apache.catalina.core.StandardHostです。上記の共通属性に加えて、次の追加属性をサポートしています。
属性 | 未指定時の デフォルト値 |
説明 |
---|---|---|
copyXML | false | アプリケーション内に埋め込まれたコンテキストXML記述子(/META-INF/context.xml)をアプリケーションのデプロイ時にxmlBaseにコピーする場合は、trueに設定します。 その後の開始時に、コピーされたコンテキストXML記述子は、アプリケーション内部に埋め込まれた記述子がより新しいものであっても、アプリケーション内部に埋め込まれたあらゆるコンテキストXML記述子に優先して使用されます。 フラグのデフォルト値はfalseです。 deployXMLがfalseの場合、この属性は無効です。 |
deployXML | true(※) | アプリケーション内に埋め込まれたコンテキストXML記述子(/META-INF/context.xml)の解析を無効にする場合は、falseに設定します。 セキュリティを意識した環境では、アプリケーションがコンテナの構成とやりとりするのを防ぐため、これをfalseに設定する必要があります。 管理者は、外部コンテキスト構成ファイルを提供し、xmlBase属性で定義された場所に配置する必要があります。 このフラグがfalseの場合、記述子は/META-INF/context.xmlにあり、記述子はxmlBaseに存在せず、 記述子に安全な配備のための必要な構成(RemoteAddrValveなど)が含まれている場合にコンテキストが開始されません。 (※)フラグの値は、デフォルトがfalseの場合にセキュリティマネージャが有効にされていない限り、デフォルトでtrueになります。 セキュリティマネージャの下で実行する場合、org.apache.catalina.security.DeployXmlPermissionをWebアプリケーションに付与することで、 Webアプリケーションごとに有効にすることができます。マネージャとホストマネージャのアプリケーションにはデフォルトでこのアクセス権が与えられているため、 セキュリティマネージャの下で動作しているときも引き続き動作します。 |
errorReportValveClass | ※.1 | このホストによって利用されるエラーを通知するJavaクラスの完全修飾子。 エラー情報を出力することが、このクラスの責務です。 この属性を設定する事によりTomcatによって解析されたエラー頁の表示機能をカスタマイズできます。 org.apache.catalina.Valveをインターフェイス(implements)にしたクラスのみ設定可能です。 (※.1)未指定時には、org.apache.catalina.valves.ErrorReportValveがデフォルト値として利用されます。 |
unpackWARs | true | appBase属性で指定したWebアプリケーションを配備先ディレクトリにおいて、 WARファイル形式だけでなく展開されたディレクトリ構造のWebアプリケーションの配備を許可するかのフラグ。 falseを指定するとWARファイル形式のWebアプリケーションのみ配備ができます。 詳細は、「自動アプリケーションの配置」を参照してください。 補足事項:TomcatがWARファイルを展開した場合には、展開されたディレクトリ階層に/META-INF/war-trackingファイルが追加されます。 war-trackingファイルは、Tomcatが実行されていない間にWARファイルの変更を検出するために利用されます。 WARファイルが変更された場合には、Tomcatが次回起動時に展開されたディレクトリ階層の削除と更新されたWARファイルを 改めてディレクトリ階層に展開します。 補足事項:この属性をfalseに指定した場合には性能ペナルティが発生します。 パフォーマンスの大幅な低下を回避するには、Webアプリケーションの設定をサーブレット3.0以上にリリースされた プラガブルな機能であるクラススキャニングが不要になる構成にする必要性があります。 ユーザーは、ExtractingRoot Resourcesの実装を検討することもできます。 |
workDir | true | このホストに配備されたWebアプリケーションの作業用ディレクトリのパスを指定します。 各アプリケーションには、一時的な読み書き可能な独自のサブディレクトリがあります。 コンテキスト(/conf/エンジン名/ホスト名/アプリケーション名.xml 又はWARファイル内のMETA-INF/context.xml)に同属性を指定していた場合には、 server.xmlのHost要素に指定していた場合でもコンテキストで指定した値が利用されます。 このディレクトリは、サーブレット仕様で説明されているjavax.servlet.context.tempdirという名前のサーブレットコンテキスト属性(java.io.File型)によってWebアプリケーションのサーブレットから設定したパスを取得できます。 Servletを継承したクラスから一時作業ディレクトリの取得方法例) ServletContext context = this.getServletContext(); File workdir = (File) context.getAttribute("javax.servlet.context.tempdir"); 未指定時には、$CATALINA_BASE/workの下の適切なディレクトリが提供されます。 |
このHost要素には、この仮想ホストに関連付けられた別のWebアプリケーションを表す1つ以上のContext要素をネストすることができます。
Host要素内の対応する要素をネストすることによって、次のユーティリティコンポーネントのインスタンスを最大で1つ入れ子にすることができます。
(筆者追記)Tomcatの古いバージョンはserver.xmlに全ての要素を定義していました。
Tomcatが普及され多くのWebアプリケーションが配備されることでserver.xmlファイルだけではファイルの肥大化と保守性が劣化する事を解消するために、
Tomcatサーバーの主たる設定を定義するserver.xmlとWebアプリケーション固有の設定ファイルであるコンテキスト.xmlに分離されました。
子要素のContext要素は、$CATALINA_BASE/conf/エンジン名/ホスト名/アプリケーション名.xmlファイル内に別ファイルに定義します。
エンジンは、org.apache.catalina.core.ContainerBase.[enginename]ログカテゴリに関連付けられています。
角括弧は実際には名前の一部であり、省略しないことに注意してください。
Webサーバーを実行すると、通常生成される出力ファイルの1つがアクセス・ログになります。
アクセス・ログは、サーバーによって処理される各要求ごとに1行の情報を標準形式で生成します。
Catalinaには、Webサーバーやカスタム形式で作成された同じ標準フォーマットでアクセスログを作成できるオプションのValve実装が含まれています。
Catalinaに、Engine、Host、Contextで処理されたすべてのリクエストに対するアクセスログを、次のようにValve要素を入れ子にして作成することができます:
server.xmlのデフォルト設定値
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" >
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
サポートされているコンフィグレーション属性の詳細については、「ロギング・バルブにアクセスする」を参照してください。
デフォルトの設定で標準のホスト実装を使用している場合、appBaseのアプリケーションまたはconfigBaseのコンテキストファイルを使用してTomcatを起動すると自動的にデプロイされます(deployOnStartupプロパティはデフォルトでtrue)。
変更が検出されたときに再ロードまたは再デプロイされるTomcatは実行中です(autoDeploy属性のデフォルト値はtrueです)。
deployOnStartupとautoDeployはまったく同じコードの実行をトリガーするので、動作は非常に似ています。しかし、1つの重要な違いがあります。
Tomcatが起動すると、どのファイルが同じで、どのファイルが変更されているのか、そしてどのファイルが新しいのかは分かりません。
したがって、すべてのファイルを新しいファイルとして扱います。 Tomcatは実行中ですが、変更されていないファイルと変更されたファイルと新しいファイルを区別できます。
これにより、Tomcatが実行されている間に変更されるファイルと、Tomcatが停止している間にファイルが変更されることの間に、いくつかの動作の違いが生じます。
自動デプロイメントを使用する場合、ホストのappBaseおよび/またはconfigBaseに存在する関連ファイル(Webアプリケーションにはcontext.xmlファイル、WARおよびディレクトリがある可能性があります)は、
予期された命名規則に準拠している必要があります。つまり、同じWebアプリケーションのファイルは同じベース名を共有する必要があります。
自動展開プロセスでは、次の検索順序を使用して新規および/または変更されたWebアプリケーションを識別します。
autoDeployがtrueの場合、自動デプロイメントプロセスはデプロイされたWebアプリケーションの変更を監視します。
どのような変更が行われたかによって、Webアプリケーションは再配備または再ロードされます。
再デプロイメントには新しいWebアプリケーションの作成が含まれ、標準セッションマネージャを使用する場合、
ユーザーセッションは保持されません。再読み込みは、既存のWebアプリケーションを使用しますが、web.xmlを再解析してすべてのクラスをリロードします。
標準セッションマネージャを使用している場合、ユーザーセッションは永続化されます。
ユーザーは、自動展開プロセスが再ロードを監視するファイルに追加することができます。
つまり、WatchedResources要素をcontext.xmlファイルに追加することによって、
これらのファイルのいずれかの変更によってWebアプリケーションのリロードがトリガーされます。
詳細については、コンテキストのドキュメントを参照してください。
自動デプロイメントを使用する場合、XMLコンテキストファイルで定義されたdocBaseはappBaseディレクトリの外にある必要があります。
これが当てはまらない場合は、Webアプリケーションのデプロイメントが困難な場合や、アプリケーションを2回デプロイする場合があります。
この状況を回避するには、deployIgnore属性を使用できます。
server.xmlでコンテキストを明示的に定義する場合、アプリケーションの自動デプロイメントを無効にするか、deployIgnoreを慎重に指定する必要があります。
そうしないと、Webアプリケーションがそれぞれ2回展開され、アプリケーションに問題が発生する可能性があります。
多くのサーバー環境では、ネットワーク管理者は同じサーバーのIPアドレスに解決される複数のネットワーク名(ドメインネームサービス(DNS)サーバー内)を構成しています。
通常、このような各ネットワーク名はconf/server.xmlに別々のHost要素として設定され、それぞれ独自のWebアプリケーションセットが設定されます
しかし、状況によっては、2つ以上のネットワーク名を同じ仮想ホストに解決し、同じ一連のアプリケーションを実行することが望ましい場合もあります。
このシナリオの一般的な使用例は、ユーザーがwww.mycompany.comまたはcompany.comのいずれかを利用して、
まったく同じコンテンツおよびアプリケーションにアクセスできることが望ましい企業のWebサイトです。
これは、Host要素内にネストされた1つ以上のAlias要素を利用することで実現されます。例:
ドメイン名の別名をAliasタグで表現した例
<Host name="www.mycompany.com" ...>
...
<Alias>mycompany.com</Alias>
...
</Host>
この方法を有効にするには、関係するすべてのネットワーク名をDNSサーバーに登録して、
このCatalinaのインスタンスを実行しているコンピュータと同じコンピュータに解決する必要があります。
エイリアスでは、ホストのname属性に許可されているワイルドカード形式(*.domainname)も使用できます。
このホストの開始または停止を知る必要があるJavaオブジェクトを実装している場合は、この要素の内部にListener要素をネストすることで宣言できます。
指定するクラス名は、org.apache.catalina.LifecycleListenerインタフェースを実装する必要があり、対応するライフサイクルイベントの発生を通知されます。
このようなリスナーの構成は次のようになります。
Listenerタグを利用した例
<Host name="localhost" ...>
...
<Listener className="com.mycompany.mypackage.MyListener" ... >
...
</Host>
リスナーは、この要素から構成できる追加のプロパティをいくつでも持つことができます。
属性名は、標準のプロパティーメソッド命名パターンを使用して、対応するJavaBeanプロパティー名と照合されます。
Catalinaに、周囲のEngine、Host、またはContext要素に向けられたすべての着信要求に対してIPアドレスまたはホスト名を確認するように頼むことができます。
リモートアドレスまたは名前は、java.util.regex正規表現構文を使用して定義された、設定された「受け入れ」,「拒否」フィルタに対してチェックされます。
承認されていない場所からのリクエストは、HTTPの「禁止」エラーで拒否されます。フィルター宣言の例:
Listenerタグを利用した例
<Host name="localhost" ...>
...
<Valve className="org.apache.catalina.valves.RemoteHostValve"
allow=".*\.mycompany\.com|www\.yourcompany\.com"/>
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="192\.168\.1\.\d+"/>
...
</Host>
サポートされている構成オプションの詳細については、「リモートアドレスフィルタとリモートホストフィルタ」を参照してください。
多くの環境、特にポータル環境では、特定の仮想ホストにデプロイされたWebアプリケーションのセットに対して一度だけ自分自身を認証することをユーザーに求めることが望まれます。
これは、次のような要素をこの仮想ホストのHost要素の中にネストすることで実現できます。
Listenerタグを利用した例
<Host name="localhost" ...>
...
<Valve className="org.apache.catalina.authenticator.SingleSignOn"/>
...
</Host>
シングルサインオン機能は、次のルールに従って動作します。
多くのWebサーバーは、チルダ文字( "〜")で始まる要求URIとユーザー名を、サーバー上のそのユーザーのホームディレクトリにあるディレクトリ
(一般にpublic_htmlという名前)に自動的にマップできます。このような特殊なListener要素
(有効なユーザーを識別するために/etc/passwdファイルを使用するUnixシステム上)を使用することで、Catalinaで同じことを達成できます。
ListenerタグでUserConfigを利用した例
<Host name="localhost" ...>
...
<Listener className="org.apache.catalina.startup.UserConfig"
directoryName="public_html"
userClass="org.apache.catalina.startup.PasswdUserDatabase"/>
...
</Host>
/etc/passwdが使用されていないサーバでは、指定されたベースディレクトリ(この例ではc:\yen;Homesなど)
にあるすべてのディレクトリを「ユーザホーム」ディレクトリと見なすようにCatalinaに要求することができます。この例:
ListenerタグでUserConfigを利用した例
<Host name="localhost" ...>
...
<Listener className="org.apache.catalina.startup.UserConfig"
directoryName="public_html"
homeBase="c:\yen;Homes"
userClass="org.apache.catalina.startup.HomesUserDatabase"/>
...
</Host>
ユーザーホームディレクトリがcraigmccという名前のユーザー用に設定されている場合、その内容は次のようなURLに要求することによってクライアントブラウザから表示されます。
この機能をうまく使用するには、次の点を考慮する必要があります。