web-dev-qa-db-ja.com

Tomcat WebアプリのグローバルURIプレフィックスを追加する

パスが「/ apps /」で始まるすべてのリクエストがApacheによってTomcatにプロキシされるリバースプロキシ構成を設定しています。このIMOには2つの利点があります。URIスペースの「/ apps /」部分のみへのプロキシを予約でき、すべてのTomcatアプリに単一のプロキシルールのみを使用できます(つまり、Tomcatアプリのリクエストは、 '/ apps /')。

たとえば、 http:// mydomain/apps/my_app / のリクエストは、 http:// localhost:8082/my_app / にプロキシする必要があります。 Tomcat URIに「/ apps /」プレフィックスがないことに注意してください。「my_app」は、$ {CATALINA_HOME}/webapps/my_appの通常の場所にあります。

Apache vhost.confファイルで次のプロキシルールを使用してこれを実現しました。

ProxyPreserveHost    on
ProxyPass            /apps/    http://localhost:8082/
ProxyPassReverse    /apps/    http://mydomain/

(注:Tomcatアプリは、さらにリンクを生成するために元のホストにアクセスする必要があるため、ProxyPreserveHostを使用しました)。 Tomcatアプリの一部によって生成される絶対リンクを除いて、すべてうまくいきます。上記の構成の場合、Tomcatアプリはこのリクエストを「参照」します http:// mydomain/my_app 、つまり、これらのリンクのプロキシをトリガーする「/ apps /」プレフィックスのないリンクを生成します。

少し時間がかかりましたが、これはプロキシの本質的な特性であり、プロキシされたアプリに元のリクエストの「/ apps /」プレフィックスを渡す「標準」の方法がないことを理解しました。したがって、私は別の可能性、つまりすべてのTomcatアプリのグローバルプレフィックスを定義し、Tomcatアプリを次の設定でプロキシすることを検討し始めました。

ProxyPreserveHost    on
ProxyPass            /apps/    http://localhost:8082/apps/
ProxyPassReverse    /apps/    http://mydomain/apps/

これは、 http:// mydomain/apps/my_app / の要求を http:// localhost:8082/apps/my_app / にプロキシします。 Tomcatサーバー上のすべてのアプリはプロキシの背後でアクセスされるため、この '/ apps /'プレフィックスがすべてのTomcatアプリに必要になることは問題ありません。

ここまでは順調ですね。それでも、私はこのアプローチのTomcat側で苦労しています。Tomcatアプリへのリクエストにグローバルパスプレフィックスを追加する方法を見つけています。私が得た最も近いものはこれです:1. Tomcatアプリの物理的な場所に触れないでください:$ {CATALINA.HOME}/webappsのままにします2.次のように$ {CATALINA.HOME} /conf/server.xmlを変更します:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="false" deployOnStartup="false">
  <Context path="/apps/my_app" docBase="/my_app/" reloadable="true"/>
</Host>

これにより、my_app Tomcatアプリに http:// localhost:8082/apps/my_app / でアクセスできるようになりますが、すべてのTomcatアプリを個別の要素で手動で定義する必要があることも示唆しています。これにより、新しいTomcat Webアプリを追加する柔軟性が低下します(実際には、「/ apps /」接頭辞なしで、Apache設定でアプリごとに個別のプロキシルールを宣言するよりも多くの設定作業が必要になります)。私はこれを試しました:

<Context path="/apps" docBase="/" reloadable="true"/>

(および ""、 "。"などの@docBaseバリアント)ですが、これは機能しません。Tomcatコンソール出力にWebアプリケーションがデプロイされていることを示すものはなく、すべてのリクエストが404エラーを返します。

したがって、私の質問:Tomcat WebアプリケーションのグローバルURIプレフィックスを「宣言」する簡単な(r)方法はありますか?

アドバイスは大歓迎です!

ロン

7
rvdb

他の人のために、自分の質問に答えます。実際、Tomcat(バージョン6以降)は、webappフォルダーまたはWARファイル名にそのプレフィックス(またはそれらのプレフィックス)をプレフィックスとしてハッシュで区切ることにより、webappsにURIプレフィックスを追加するための非常に簡単なソリューションを提供します。したがって、例:

${catalina.base}/webapps/apps#my_app
${catalina.base}/webapps/apps#my_app2.war

...両方とも http:// localhost:8082/apps/my_app /http:// localhost:8080/apps/my_app2 / でそれぞれアクセスできるようにします。 $ {catalina.base} /conf/server.xmlでの追加の設定なし。

これは Tomcat Context Container リファレンスでやや謎めいて説明されていますが、Tomcat-usersメーリングリストの this kind message を参照してください。

残念ながら落とし穴があります:明らかに、Cocoon(2.1.11まで、2.2アプリでテストされていません)は、パスにハッシュが含まれているWebアプリをチョークします( https://issues.Apache.org/jira/browse/COCOON-227 を参照)。

ただし、次の構成手順に示すように、CocoonベースのWebアプリケーションには回避策があります。

  1. ホストのappBaseパスの外にwebappを含むフォルダーまたはWARファイルを移動します。例:F:\ cocoonApps\my_CocoonApp
  2. ファイル$ {catalina.base}\conf\Catalina [Host name] [prefix]#[app name] .xmlを追加します。例:$ {catalina.base}\conf\Catalina\localhost\apps#my_CocoonApp.xml、次のコンテンツ:

    <Context docBase="F:/cocoonApps/my_CocoonApp"/>

この回避策を使用すると、Cocoon webappsでも、たとえばにアクセスしたときに満足できます。 http:// localhost:8082/apps/my_CocoonApp / 。これにより、Tomcat Webアプリケーションの非常に柔軟な管理オーバーヘッドが可能になります。

  • cocoonベース以外のWebアプリケーション:ホストのappBaseに追加し、フォルダーまたはWARファイルの名前の先頭に、ハッシュ(#)で区切られた目的のプレフィックスを付けます。新しい非Cocoon Webアプリケーションを追加するには、目的のURIプレフィックスを付けて保存する以外の手順は必要ありません。
  • Cocoonベースのウェブアプリ:接頭辞のないウェブアプリ名だけを使用して、ホストのappBaseの外部に保存します。さらに、CocoonベースのWebアプリケーションごとにコンテキストファイルを追加し、上記のようにWebアプリケーションのを指定します。この追加の手順は、CocoonベースのWebアプリケーションでのみ必要です。

元の質問で説明したApacheプロキシ設定を使用すると、Tomcatアプリを柔軟に追加し、/ apps/URIプレフィックスを使用してApacheの背後にリバースプロキシすることができます。

4
rvdb