プロキシサポート活用術

目次

はじめに

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  https://:8081/myapp
    ProxyPassReverse  /myapp  https://:8081/myapp

    これは、Apacheに対し、https:///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-INF/web.xml)内で定義されたフィルターやセキュリティ制約によって処理されない静的コンテンツをWebサーバーが提供するように設定できます。