プロキシサポート How-To

目次

はじめに

Tomcatの標準構成を使用すると、Webアプリケーションは、リクエストが処理のために転送されたサーバー名とポート番号を要求できます。TomcatがHTTP/1.1コネクタを使用してスタンドアロンで実行されている場合、通常、リクエストで指定されたサーバー名と、コネクタがリッスンしているポート番号をレポートします。この目的で使用されるサーブレットAPI呼び出しは次のとおりです。

  • ServletRequest.getServerName(): リクエストが送信されたサーバーのホスト名を返します。
  • ServletRequest.getServerPort(): リクエストが送信されたサーバーのポート番号を返します。
  • ServletRequest.getLocalName(): リクエストを受信したインターネットプロトコル(IP)インターフェースのホスト名を返します。
  • ServletRequest.getLocalPort(): リクエストを受信したインターフェースのインターネットプロトコル(IP)ポート番号を返します。

プロキシサーバー(またはプロキシサーバーのように動作するように構成されたWebサーバー)の背後で実行している場合、これらの呼び出しによって返される値を管理したい場合があります。特に、通常、ポート番号は、コネクタ自体がリッスンしているポートではなく、元のリクエストで指定されたポートを反映するようにする必要があります。これらの値を構成するには、<Connector>要素のproxyNameおよびproxyPort属性を使用できます。

プロキシサポートには、さまざまな形式があります。次のセクションでは、いくつかの一般的なケースにおけるプロキシ構成について説明します。

Apache httpd プロキシサポート

Apache httpd 1.3以降のバージョンは、Webサーバーをプロキシサーバーとして機能させるオプションのモジュール(mod_proxy)をサポートしています。これは、mod_jkなどのWebコネクタを構成しなくても、特定のWebアプリケーションへのリクエストをTomcatインスタンスに転送するために使用できます。これを実現するには、次のタスクを実行する必要があります。

  1. Apacheのコピーを、mod_proxyモジュールが含まれるように構成します。ソースからビルドする場合は、./configureコマンドラインで--enable-module=proxyディレクティブを含めるのが最も簡単な方法です。

  2. まだ追加されていない場合は、httpd.confファイルで次のディレクティブを使用して、Apacheの起動時にmod_proxyモジュールをロードしていることを確認してください。

    LoadModule proxy_module  {path-to-modules}/mod_proxy.so
    
  3. Tomcatに転送したいWebアプリケーションごとに、httpd.confファイルに2つのディレクティブを含めます。たとえば、コンテキストパス/myappにあるアプリケーションを転送するには、次のようにします。

    ProxyPass         /myapp  http://localhost:8081/myapp
    ProxyPassReverse  /myapp  http://localhost:8081/myapp

    これにより、Apacheはhttp://localhost/myapp/*の形式のURLを、ポート8081でリッスンしているTomcatコネクタに転送するように指示します。

  4. Tomcatのコピーを、適切なプロキシ設定を含む特別な<Connector>要素を含めるように構成します。たとえば、次のようにします。

    <Connector port="8081" ...
                  proxyName="www.mycompany.com"
                  proxyPort="80"/>

    これにより、このWebアプリケーション内のサーブレットは、すべてのプロキシリクエストがポート80のwww.mycompany.comに送信されたと認識します。

  5. <Connector>要素からproxyName属性を省略することは合法です。省略した場合、request.getServerName()によって返される値は、Tomcatが実行されているホスト名になります。上記の例では、localhostになります。

  6. ポート8080でリッスンしている<Connector>も(同じService要素内に入れ子になっている)ある場合、どちらのポートへのリクエストも、同じ仮想ホストとWebアプリケーションのセットを共有します。

  7. オペレーティングシステムのIPフィルタリング機能を使用して、ポート8081への接続(この例では)を、Apacheを実行しているサーバーのみからの接続に制限することをお勧めします。

  8. または、次のように、プロキシ経由でのみ利用可能な一連のWebアプリケーションを設定することもできます。

    • プロキシポート用の<Connector>のみを含む別の<Service>を構成します。
    • プロキシ経由でアクセス可能な仮想ホストとWebアプリケーションに対して、適切なEngineHost、およびContext要素を構成します。
    • オプションで、前に説明したようにIPフィルターでポート8081を保護します。
  9. リクエストがApacheによってプロキシされる場合、Webサーバーはこれらのリクエストをアクセスログに記録します。したがって、通常、Tomcat自体が実行するアクセスロギングを無効にする必要があります。

リクエストがこの方法でプロキシされる場合、構成されたWebアプリケーションに対するすべてのリクエストは、Tomcatによって処理されます(静的コンテンツのリクエストを含む)。mod_proxyの代わりにmod_jkWebコネクタを使用すると、パフォーマンスを向上させることができます。mod_jkは、Webサーバーが、Webアプリケーションのデプロイメント記述子(/WEB-INF/web.xml)内で定義されたフィルターまたはセキュリティ制約によって処理されない静的コンテンツを提供するように構成できます。