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