以下のバージョンを使用します。
・Apache HTTP Server 2.4
・Tomcat 10.1.8 (Spring Boot 3.0.6 に組み込まれているもの)
Spring Boot を使用してアプリケーションを作成しました。
Apache HTTP ServerとTomcat を連携させる理由
- 静的ファイルと動的コンテンツの分離
Apache HTTP Serverは、静的なファイルを高速に配信することが得意です。一方で、動的なコンテンツを扱うことは得意ではありません。Tomcatは、動的なコンテンツを高速に生成することが得意です。
- 負荷分散装置として Apache HTTP Server を使う
Apache HTTP Serverを負荷分散装置として使用することで、複数のTomcatサーバを用意し、アプリケーションの負荷を分散することができます。これにより、スケーラビリティを向上させることができます。例えば、ピーク時にはTomcatサーバを増やして対応することができます。
- セキュリティの強化
Apache HTTP Serverには多くのセキュリティ機能が備わっており、Tomcatとの役割分担が明確になります。しかし、Tomcat側の開発者もセキュリティの知識は必要です。(SQLインジェクションなどは Apache 側では防ぎきれないため)
Apache HTTP Serverをリバースプロキシとして設定する方法
httpd.confをいじります。
mod_proxy と mod_proxy_http を有効化する
まず、mod_proxy と mod_proxy_http を有効化してください。httpd.conf の抜粋です。
修正前:
#LoadModule proxy_module modules/mod_proxy.so #LoadModule proxy_http_module modules/mod_proxy_http.so
修正後:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
プロキシの設定を記載する
例を示します。
httpd.conf の一番下にでも追記します。
ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/
この ProxyPass の設定では 例えば「http://example.com/aaa」というリクエストを受け取ったら「http://localhost:8080/aaa」に転送します。
ProxyPassReverse の設定では例えばレスポンスのHTMLに「<a href="http://localhost:8080/bbb">」という記述があった場合に、Apache HTTP Serverはこれを「<a href="http://example.com/bbb">」に置き換えます。
ajp との違い
Apache HTTP Server と Tomcat をつなぐ方法としては今回紹介したリバースプロキシの他に AJP (Apache JServ Protocol) という方法もあります。
AJPは、Apache HTTP ServerとTomcat間で高速なバイナリ通信を行うプロトコルであり、HTTPリクエストの高速な処理が必要な場合に適しています。
一方、リバースプロキシを使用する場合、Apache HTTP Server は Tomcat に対して HTTP リクエストを送信します。
ネットワークトラブルが起きた際の解析は HTTP 通信であるリバースプロキシの方が簡単であることは容易に想像できると思います。
まとめ
今回は、Apache HTTP Server をリバースプロキシとして Tomcat と接続する方法を紹介しました。
ざっくり重要な 2 点です。
- Apache HTTP ServerとTomcatを連携させることで、静的ファイルと動的コンテンツの分離や負荷分散、セキュリティ強化が可能になります。
- Apache HTTP Serverをリバースプロキシとして設定する場合、mod_proxyとmod_proxy_httpを有効化し、ProxyPassとProxyPassReverseを設定します。
本日はここまで、それでは!