プロキシサポート 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インスタンスに転送するために使用できます。これを実現するには、次のタスクを実行する必要があります。
Apacheのコピーを、
mod_proxy
モジュールが含まれるように構成します。ソースからビルドする場合は、./configure
コマンドラインで--enable-module=proxy
ディレクティブを含めるのが最も簡単な方法です。まだ追加されていない場合は、
httpd.conf
ファイルで次のディレクティブを使用して、Apacheの起動時にmod_proxy
モジュールをロードしていることを確認してください。LoadModule proxy_module {path-to-modules}/mod_proxy.so
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コネクタに転送するように指示します。Tomcatのコピーを、適切なプロキシ設定を含む特別な
<Connector>
要素を含めるように構成します。たとえば、次のようにします。<Connector port="8081" ... proxyName="www.mycompany.com" proxyPort="80"/>
これにより、このWebアプリケーション内のサーブレットは、すべてのプロキシリクエストがポート80の
www.mycompany.com
に送信されたと認識します。<Connector>
要素からproxyName
属性を省略することは合法です。省略した場合、request.getServerName()
によって返される値は、Tomcatが実行されているホスト名になります。上記の例では、localhost
になります。ポート8080でリッスンしている
<Connector>
も(同じService要素内に入れ子になっている)ある場合、どちらのポートへのリクエストも、同じ仮想ホストとWebアプリケーションのセットを共有します。オペレーティングシステムのIPフィルタリング機能を使用して、ポート8081への接続(この例では)を、Apacheを実行しているサーバーのみからの接続に制限することをお勧めします。
または、次のように、プロキシ経由でのみ利用可能な一連のWebアプリケーションを設定することもできます。
リクエストがApacheによってプロキシされる場合、Webサーバーはこれらのリクエストをアクセスログに記録します。したがって、通常、Tomcat自体が実行するアクセスロギングを無効にする必要があります。
リクエストがこの方法でプロキシされる場合、構成されたWebアプリケーションに対するすべてのリクエストは、Tomcatによって処理されます(静的コンテンツのリクエストを含む)。mod_proxy
の代わりにmod_jk
Webコネクタを使用すると、パフォーマンスを向上させることができます。mod_jk
は、Webサーバーが、Webアプリケーションのデプロイメント記述子(/WEB-INF/web.xml
)内で定義されたフィルターまたはセキュリティ制約によって処理されない静的コンテンツを提供するように構成できます。