web-dev-qa-db-ja.com

Tomcatに複数のアプリケーションをデプロイする

2つのアプリケーションfoo.warbar.warを同じTomcatインスタンスにデプロイします。彼らが異なるポートで接続をリッスンすることは可能ですか? fooはポート81でリッスンし、barはポート82でリッスンしますか?もしそうなら、どのようにこれを設定できますか?アプリケーションが異なるポートでリッスンする必要はないことを理解していますが、それは私が達成したいことです。

また、ルートコンテキストで実行されるようにfoo.warの名前をROOT.warに変更すると、このTomcatインスタンスへのすべてのリクエストはfooアプリによって処理されるため、barは個別のTomcatインスタンスにデプロイしますか?

33
Dónal

Tomcatが複数のポートをリッスンするようにする場合は、各ポートにconnectorを設定する必要があります。各ポートを異なるアプリケーションにマッピングするには、各コネクタをserviceでラップして、Hostを作成する必要があります自分のappBase

server.xmlのサービス定義の例:

<Service name="foo">
    <Connector port="80" protocol="org.Apache.coyote.http11.Http11NioProtocol" />
    <Engine name="Catalina80" defaultHost="localhost">
        <Host name="localhost" appBase="foo" unpackWARs="true" autoDeploy="true" />
    </Engine>
</Service>

<Service name="bar">
    <Connector port="81" protocol="org.Apache.coyote.http11.Http11NioProtocol" />
    <Engine name="Catalina81" defaultHost="localhost">
        <Host name="localhost" appBase="bar" unpackWARs="true" autoDeploy="true" />
    </Engine>
</Service>

webappsディレクトリにwarファイルをドロップする代わりに、ポート80にディレクトリfooおよびポート81barを作成する必要があります。両方のwarファイルにROOT.warという名前を付け、独自のベースディレクトリにドロップします。もちろん、必要に応じて、各ディレクトリに複数のアプリを含めることができます。

appBaseで定義されているディレクトリは、Tomcatディレクトリに相対的です。絶対パスを使用すると、システム上の任意の場所に配置できます。 ドキュメント から:

appBase

この仮想ホストのApplication Baseディレクトリ。これは、この仮想ホストにデプロイされるWebアプリケーションが含まれるディレクトリのパス名です。絶対パス名、または$CATALINA_BASEディレクトリに相対的なパス名を指定できます。 [...]指定しない場合、デフォルトのwebappsが使用されます。

別のオプションは、デフォルトのTomcat構成を保持し、別のhttpサーバー(Apache、nginx、lighttpd、...)を使用して、ポートをTomcatアプリケーションの内部パスにマップすることです。

ルートアプリケーションは、他のアプリケーションと一致するリクエストを受信しません。 /foo/examplefoo.warに移動し、/example/exampleROOT.warに移動します。

66
kapex

ポートを変更する必要はありません

Javaサーブレットテクノロジー。すべてのトラフィックを単一のポートで処理できます。

両方のwarファイルをTomcatのwebappsフォルダーにドロップするだけです。あなたがする必要があるのはそれだけです。

デフォルトでは、Tomcatは各戦争(厳密にはZipファイル)をフォルダーに展開(「爆発」)し、アプリを自動的にデプロイします。これは、Tomcatがすでに実行されている場合はオンザフライで、Tomcatを起動するときは起動時に発生します。 Tomcatが新しいwarファイルをスキャンする作業を節約するために、実稼働用の自動デプロイ機能をオフにする人もいます。

複数のポートは必要ありません。サーブレットコンテナの仕事は、URLを調べて、どのサーブレットを呼び出すかを決定することです。

デフォルトでは、warファイルの名前がURLを決定します。あなたの例を考えると:

すべてのWebアプリを同じポートで提供できます。ポートに関する唯一の懸念は、小さい番号のポートへのアクセスを保護するUnixスタイルのオペレーティングシステムを使用する場合です。これには、Mac OS X、BSD、Linux、およびSolarisが含まれます。 URLで大きい番号のポートを使用するか(Tomcatのデフォルトは8080)、または port-forwarding を使用して、ポート80(Webブラウザーのデフォルト)の着信要求をTomcatのポート(8080など)に送信します。

異なるドメインを使用してwarファイルを提供する場合は、Tomcatの「仮想ホスト」設定について学習します。

28
Basil Bourque

複数のポートでアプリを実行するようにTomcatを正常に構成しました。これがこれを行うための最良の方法であるかどうかはわかりませんが、単にコンテンツを複製しました

<Service>...</Service>

conf/server.xmlでConnectorタグのポートを変更し、HostタグのappBase属性を変更しました。 appBaseに基づいて、アプリを実行するポートを制御します。

4
Jeff Miller

私はすでにバジルが言及していることをやっていた。

判明したように、私はsites-enabled/blah.confファイルをワイルドカード化して、別のアプリを追加する数ヶ月前にデプロイした最初の(そして唯一の).warを参照しないようにする必要がありました。

ここに私がワイルドカードしたものがあります:

  • DocumentRoot
  • JkMount
  • ディレクトリ
  • DirectoryIndex

それで、fyi、ya'll。 :)

0
Mr. Butterworth