【AWS】ApacheとTomcatの連携手順を解説

ITナレッジ

今回は、ApacheとTomcatを連携させる手順について、初級インフラエンジニアの方でも迷わず設定できるよう、丁寧に解説していきます。

Webシステムの構築現場では「ApacheとTomcatを組み合わせて使う」という構成が非常によく登場します。しかし、初めて設定する場合は「そもそも何故2つ組み合わせるの?」「どの方式で連携させればいい?」と疑問が尽きないものです。

この記事では、連携の背景・理由から始め、実際のコマンド・設定例まで一通り解説します。読み終えた後には「なるほど、こういう仕組みだったのか」と腹落ちできる内容を目指しています。


ApacheとTomcatそれぞれの役割

まず基本を整理しておきましょう。Apache(正式名称:Apache HTTP Server)とTomcatは、どちらも「Webサーバー」と呼ばれることがありますが、得意分野がまったく異なります。

Apache HTTP Server は、静的コンテンツ(HTML、CSS、画像ファイルなど)の配信を高速・安定して行うことを得意としています。また、SSL/TLS終端・アクセス制御・リダイレクト処理など、フロントエンドとしての役割を幅広くこなします。

Apache Tomcat は、Javaで書かれたWebアプリケーション(ServletやJSP)を実行するための「アプリケーションサーバー」です。HTTPリクエストを受け付ける機能も持っていますが、大量の静的コンテンツ配信や高度なアクセス制御はApacheに任せたほうが効率的です。

つまり、両者は役割の異なるサーバーを組み合わせることで、互いの弱点を補い合う関係にあります。


2つを連携させる理由

「Tomcatだけでも動くのでは?」と思う方もいるでしょう。実際、開発環境ではTomcat単体でも十分です。しかし本番環境では以下の理由からApacheとの連携が推奨されます。

  • 静的コンテンツの高速配信: 画像やCSS、JavaScriptはApacheが直接返すため、Tomcatへの負荷を大幅に削減できます。
  • SSL/TLS処理の集中管理: HTTPS対応はApache側で一元管理でき、Tomcat側はHTTP通信のみ処理すればよくなります。
  • セキュリティ強化: ApacheをリバースプロキシとしてTomcatを外部から隠蔽することで、直接アクセスによるリスクを低減できます。
  • 負荷分散との相性: 複数Tomcatへの振り分け(クラスタリング)もApacheを経由することで比較的容易に実現できます。

連携方式の種類と選び方

ApacheとTomcatを連携させる方式は主に2種類あります。

mod_jk

JK Connectorとも呼ばれる歴史ある方式です。AJPプロトコルを使ってApacheとTomcatが通信します。細かいチューニングが可能で、クラスタリング設定に強みがありますが、設定ファイル(workers.properties)が独自形式で学習コストがやや高めです。

mod_proxy_ajp(推奨)

Apacheに標準で組み込まれているmod_proxymod_proxy_ajpモジュールを使う方式です。設定がApacheの通常の構文で書けるため、可読性が高く、初級エンジニアにも扱いやすいです。新規構築では基本的にこちらを選べば問題ありません。

本記事では mod_proxy_ajp を使った手順を解説します。


前提環境と事前確認

本記事では以下の環境を前提とします。

項目 バージョン例
OS CentOS 7 / RHEL 8系
Apache HTTP Server 2.4系
Apache Tomcat 9.x または 10.x
Java OpenJDK 11以上

事前に以下のコマンドでApacheとTomcatがインストール済みであることを確認してください。

# Apacheのバージョン確認
httpd -v

# Tomcatのバージョン確認(インストールパスによって異なる)
/opt/tomcat/bin/version.sh

# Javaのバージョン確認
java -version

また、必要なモジュールが有効化されているか確認します。

# モジュールの確認
httpd -M | grep proxy

proxy_moduleproxy_ajp_module が表示されれば問題ありません。表示されない場合は後述の設定で有効化します。


mod_proxy_ajpを使った連携設定手順

ステップ1: TomcatのAJPコネクターを有効化する

Tomcatの設定ファイル server.xml を編集し、AJPコネクターを有効にします。

vi /opt/tomcat/conf/server.xml

以下の行のコメントアウトを外し(または追記し)、secretRequired を設定します。

<!-- AJPコネクター設定 -->
<Connector protocol="AJP/1.3"
           address="127.0.0.1"
           port="8009"
           redirectPort="8443"
           secretRequired="false" />

⚠️ セキュリティTips: address="127.0.0.1" を指定することで、AJPポートへの外部からの直接アクセスを防止できます。本番環境では必ずこの設定を入れてください。secretRequired="false" はローカル連携のみを想定した設定です。インターネット公開環境では secret を設定することを検討してください。

ステップ2: Apacheの設定ファイルを編集する

/etc/httpd/conf.d/ 配下に連携用の設定ファイルを作成します。

vi /etc/httpd/conf.d/tomcat_proxy.conf

以下の内容を記述します。

# mod_proxyモジュールの有効化
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

<VirtualHost *:80>
    ServerName example.com

    # 静的コンテンツはApacheが直接配信
    DocumentRoot /var/www/html

    # /app/ 配下のリクエストをTomcatへプロキシ
    ProxyPass /app/ ajp://127.0.0.1:8009/app/
    ProxyPassReverse /app/ ajp://127.0.0.1:8009/app/

    # プロキシ先へのアクセス許可
    <Proxy *>
        Require all granted
    </Proxy>

    ErrorLog /var/log/httpd/tomcat_error.log
    CustomLog /var/log/httpd/tomcat_access.log combined
</VirtualHost>

設定の意味を補足します。ProxyPass はApacheが受け取ったリクエストをTomcatへ転送する設定、ProxyPassReverse はTomcatからのレスポンスヘッダー(Locationなど)を書き換えてクライアントに正しくURLを返すための設定です。この2行はセットで記述するのが鉄則です。

ステップ3: 設定の文法チェックと再起動

設定ファイルに誤りがないかチェックしてからApacheを再起動します。

# 設定ファイルの文法チェック
httpd -t

# 問題なければ再起動
systemctl restart httpd

# Tomcatも再起動
/opt/tomcat/bin/shutdown.sh
/opt/tomcat/bin/startup.sh

httpd -tSyntax OK が返れば文法エラーはありません。再起動前に必ずこのチェックを行う習慣をつけましょう。


動作確認の方法

ブラウザまたは curl コマンドで動作を確認します。

# ApacheへのHTTPアクセスがTomcatに転送されるか確認
curl -v http://localhost/app/

# ステータスコード200が返ればOK

Tomcat側のログも併せて確認しておきます。

# Tomcatのアクセスログを確認
tail -f /opt/tomcat/logs/localhost_access_log.*.txt

リクエストがTomcat側のログにも記録されていれば、連携は成功しています。


よくあるハマりポイントと対処法

ハマり1: AJPポートへ接続できない

症状: Apacheのエラーログに Connection refused が出る。

原因と対処: Tomcatが起動していないか、AJPコネクターが無効になっている可能性があります。server.xml のAJPコネクター設定を再確認し、Tomcatを再起動してください。また、netstat -tnlp | grep 8009 でポートがListenされているか確認しましょう。

ハマり2: 503 Service Unavailableが返る

症状: ブラウザに503エラーが表示される。

原因と対処: SELinuxが有効な環境では、ApacheからTomcatへのプロキシ通信がSELinuxにブロックされることがあります。

# SELinuxの状態確認
getenforce

# 一時的に無効化してテスト(本番環境では適切なポリシー設定を推奨)
setenforce 0

# または、httpd_can_network_connectを許可
setsebool -P httpd_can_network_connect 1

SELinuxが原因のエラーは /var/log/audit/audit.log に記録されるので、合わせて確認してください。

ハマり3: ProxyPassReverseを書き忘れるとリダイレクトが壊れる

Tomcatアプリがリダイレクト(302レスポンス)を返す場合、ProxyPassReverse を設定していないと、クライアントがTomcatの内部アドレス(ajp://...)にリダイレクトされてしまいます。必ず ProxyPassProxyPassReverse はセットで記述してください。


まとめ

ApacheとTomcatの連携は、最初は難しそうに見えますが、仕組みを理解してしまえばシンプルな設定です。本記事のポイントを振り返ります。

  • ApacheはフロントエンドのWebサーバー、TomcatはJavaアプリを動かすアプリケーションサーバーという役割の違いを理解する
  • 連携方式はmod_proxy_ajpが現在のスタンダードで、初心者にも扱いやすい
  • TomcatのAJPコネクターはaddress="127.0.0.1"でバインドし、不要な外部アクセスを遮断する
  • 設定変更後は必ず httpd -t で文法チェックしてから再起動する
  • 503エラーが出たらSELinuxを疑うのがCentOS/RHELの鉄板パターン

インフラ構築は「動いてから勉強する」ではなく「仕組みを理解してから手を動かす」アプローチが、トラブルシュートの近道になります。ぜひ本番環境に自信を持って適用できるよう、まずは検証環境で試してみてください。


【注意】

このブログは技術に関する知識や経験を共有することを目的としており、情報の正確性に努めていますが、その内容の正確性や完全性を保証するものではありません。ブログの情報を利用する場合は、自己の責任において行動してください。ブログの内容に基づいて行った行動や決定によって生じた損害や被害について、筆者は一切の責任を負いません。

 

記事の内容の一部は、生成AIで作成しています。

ITナレッジRHEL
この記事の作者
StarTeller

30歳で異業種からITエンジニアへ転身し、10年以上にわたりインフラエンジニアとして様々な現場でシステム構築・運用に携わってきました。
得意分野はLinux/Windowsのサーバー構築・運用で、ネットワークやAWSなども実務で活用しています。このブログでは、これまでの業務で培った経験を基に、日々の業務で遭遇した問題の解決方法や、システム構築の具体的な手順を解説。現場のエンジニアが実際に「困ったとき」に参照できる情報を意識して投稿していこうと思っています。
※サーバ運用費がかかっているので、広告を掲載させて頂いてます。

StarTellerをフォローする
シェアする
StarTellerをフォローする
タイトルとURLをコピーしました