今回は、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_proxyとmod_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_module と proxy_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 -t で Syntax 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://...)にリダイレクトされてしまいます。必ず ProxyPass と ProxyPassReverse はセットで記述してください。
まとめ
ApacheとTomcatの連携は、最初は難しそうに見えますが、仕組みを理解してしまえばシンプルな設定です。本記事のポイントを振り返ります。
- ApacheはフロントエンドのWebサーバー、TomcatはJavaアプリを動かすアプリケーションサーバーという役割の違いを理解する
- 連携方式はmod_proxy_ajpが現在のスタンダードで、初心者にも扱いやすい
- TomcatのAJPコネクターは
address="127.0.0.1"でバインドし、不要な外部アクセスを遮断する - 設定変更後は必ず
httpd -tで文法チェックしてから再起動する - 503エラーが出たらSELinuxを疑うのがCentOS/RHELの鉄板パターン
インフラ構築は「動いてから勉強する」ではなく「仕組みを理解してから手を動かす」アプローチが、トラブルシュートの近道になります。ぜひ本番環境に自信を持って適用できるよう、まずは検証環境で試してみてください。
