Apache httpd と Tomcat を連携させる方法

投稿者 : OSCA

[PR] "東野・岡村の旅猿"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 本稿では、HTTPサーバーである Apache httpd とアプリケーションサーバー Apache Tomcat を連携させる方法について解説します。

Apache httpd と Apache Tomcat を連携させる目的

 Apache httpd と Apache Tomcat を連携させる目的は、インターネットからのリクエストを httpd で受付け、Java での動的な処理が必要なページの処理は裏方となる Tomcat に実行させたいためです。 この時、Apache httpd はプロキシの役目を担っていることを意識することが、本稿を読み進めて行く上で重要です。

AJP (Apache JServ Protocol)

 Apache httpd と Tomcat を連携する上で知っておかなくてはならないのは、AJP (Apache JServ Protocol) というプロトコルの存在です。 AJP プロトコルは Tomcat と通信するためのプロトコルです。 2017年現在、バージョン 1.3 が最新となっています。
 Apache httpd が受け付けたリクエストを Tomcat に連携させるために、この AJP プロトコルを用いて通信を行います。 Apache httpd で AJP を利用するためには mod_proxy_ajp というモジュールをインストールして利用します。

Tomcat を理解する

 まずは Tomcat がどのように連携を受けるのかを理解しましょう。 Tomcat の conf ディレクトリに server.xml という設定を記述する XML があります。 その server.xml を開いてみると次のような記述があるのがわかります。

...
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
...

 この記述が意味していることは「ポート8080番で HTTP 1.1 の通信を受け付ける」「ポート8009番で AJP 1.3 の通信を受け付ける」ということです。 Tomcat をインストールした際にブラウザで8080番ポートにアクセスして動作を確認するのは、ここで8080番ポートで HTTP のリクエストを受け付けるように設定しているためです。

 ここで一番言いたいことは、Tomcat は8009番ポートで AJP 1.3 の通信を受け付けているということです。 逆に言えば Apache httpd からは、この8009番ポートに AJP 通信をすれば良いということです。

Apache httpd の設定

 さて、それでは Apache httpd の設定を行い連携を行います。 前述の通り mod_proxy_ajp というモジュールが Tomcat との連携を担いますので、mod_proxy_ajp を有効にしてあげたいのですが、mod_proxy_ajp は mod_proxy モジュールに依存しているため、この2つのモジュールを読み込んであげる必要があります。 利用している OS やディストリビューションによって設定の記述箇所が異なりますが、Apache httpd の設定ファイル中から LoadModule の記述がある箇所を探し、次のように2つのモジュールが読み込まれるようにします。 ほとんとの場合、該当行の先頭にあるコメント(#)を外せば良いはずです。

CentOS 7 の場合 (/etc/httpd/conf.modules.d/00-proxy.conf)

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

 この LoadModule の設定だけでは、Apache httpd でモジュールの機能が有効になっただけなので、次にどんなパスにアクセスされた場合に Tomcat と連携するのかを設定してあげる必要があります。 次のように Tomcat と連携したいパスと Tomcat のサーバーとパスを指定します。

ProxyPass httpdでのパス ajp://サーバー名:8009/Tomcat上のパス/

 例えば、Apache httpd で受け付けた全てのリクエストを Tomcat で処理したい場合は次のようになります。 (httpd と Tomcat が同一ホストにある場合)

ProxyPass / ajp://localhost:8009/

 また sample ディレクトリへのアクセスを Tomcat 上の example と連携したい場合は次のようになります。

ProxyPass /sample/ ajp://localhost:8009/example/

 設定が完了したら Apache httpd を再起動(reload)するか再読込(graceful, reload)するのを忘れないでください。

Tips

 上述の通り Tomcat はデフォルトで8080番ポート(HTTP)と8009番ポート(AJP)での通信を受け付けています。 しかし、もしインターネットからの全てのアクセスを Apache httpd 経由でのアクセスとするのであれば8080番ポートの待受けが不要になります。 その場合 server.xml の行を削除するか、次のようにコメントアウトして、無用なポート待受けをしないようにすると良いでしょう。

...
    <!--<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />-->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
...

おわりに

 本稿では Apache httpd と Apache Tomcat を連携する方法について解説しました。

Apache Tomcat 環境構築へ戻る

Apache Tomcatのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca