山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

Apache HTTP Server をリバースプロキシとしてTomcatと連携させる

以下のバージョンを使用します。
・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を設定します。

本日はここまで、それでは!