はじめに
前回、VirtualBox上のLinux環境でTomcatを動かすことができたので、今回はApache HTTP ServerとApache Tomcatを連携したいと思います。
連携した後の処理としては、ユーザーからのリクエストはApacheで受けとり、そのリクエストの内容が動的な処理が必要であればTomcatに処理を流すといったものになります。
本記事のゴール
- ApacheのAJP設定
- TomcatのAJP設定
- Apache経由のTomcatテストページの表示
なお、本記事はApache httpd と Tomcat を連携させる方法 |を参考にさせていただきました。
環境
- Windows 10 64bit
- VirtualBox 6.1.12
- Centos 8.2
- openjdk 1.8.0_262
- Tomcat 9.0.37
- AJP 1.3
事前知識
Apache(Webサーバ)とTomcat(Webコンテナ)を併用するメリット
- TomcatにもApacheと同様にWebサーバとしての機能を持っている。
- しかし、Webサーバの専門家のApacheに比べると機能が劣ってしまう。
- なので、Tomcatが苦手な部分はApacheに任せるために併用する感じ!
AJP(Apache JServ Protocol)
- ApacheとTomcatを連携するために必要なプロトコル
mod_proxy_ajp
っていうモジュールを利用する
環境構築手順
Apacheの設定
モジュールの読み込み確認
事前知識で記載したようにAJPを有効にするにはmod_proxy_ajp
モジュールが読み込んでいる必要があるので確認していきます。
なお、本設定はApacheのバージョン?によっては、デフォルト設定が違う場合があるので注意してください。
モジュールの読み込み設定が行われているのは、/etc/httpd/conf.modules.d
配下の00-proxy.conf
に記載があるので確認します。
[root@localhost ashitaka]# cat /etc/httpd/conf.modules.d/00-proxy.conf
# This file configures all the proxy modules:
# ※一部のみ記載
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
ファイルの中身を見ると、mod_proxy_ajp
が読み込まれているので、00-proxy.conf
さえ読み込まれれば問題なさそう。
なお、mod_proxy_ajp
は mod_proxy
モジュールに依存しているのでこちらも読み込まれているとことを確認しておく。
次に00-proxy.conf
が読み込まれているかをhttpd.conf
から確認する。
[root@localhost ashitaka]# cat /etc/httpd/conf/httpd.conf
# ※一部のみ記載
Include conf.modules.d/*.conf
conf.modules.dディレクトリ内の拡張子が.confのファイルを全て読み込んでくれてるみたいなので、こちらも問題なさそう。
ProxyPassの設定
必要となるモジュールは読み込まれていることは確認できたので、クライアントからApacheにリクエストが投げられた場合に、どんなものがきたらTomcatに流すのかを設定します。
設定方法としては、httpd.confに直書きするのではなくconf.dディレクトリ内に新たにconfファイルを作成し、それを読み込ませます。
なお、conf.dディレクトリはApacheの追加設定をする際に使われるみたい。
[root@localhost ashitaka]# vi /etc/httpd/conf.d/proxy-ajp.conf
# 以下の内容をコピペする。
ProxyPass / ajp://localhost:8009/
一旦、すべてのリクエスト(/)をTomcatのポート番号8089に流すように設定しています。(8089番ポートについては後述)
これにてApache側の設定は完了したので、続いてTomcatの設定を行います。
Tomcatの設定
Apache側の設定で、ユーザーからのリクエストは8089番ポートに流すぞーっていう設定はできたので、次はTomcat側で8089受け取るぞーっていう設定を行います。
[root@localhost conf]# cat /opt/apache-tomcat-9.0.37/conf/server.xml
一部抜粋したものが以下になります。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!--
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
-->
内容としては、上側はHTTP1.1の8080番ポートの通信は受け付けるとなっています。なので、前回Tomcatのテストページを表示した際に8080番ポートを指定していたのはこれが理由になります。
下側は、デフォルトではコメントアウトされてますが、AJP1.3の8009番ポートの通信を受け付けるといった内容になっています。ここで8009番ポートとなっているので、先ほどApache側の設定ではProxyPass / ajp://localhost:8009/
と指定しています。
ここからが本題ですが、今後はApache経由のAJP通信のみ必要で直のHTTP通信は必要ないので修正します。また、この記事のはまったこと1とはまったこと2が見事にはまったので、こちらもこのタイミングで修正しておきます。
<!--
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
<Connector protocol="AJP/1.3"
address="0.0.0.0" ←★はまったこと1
port="8009"
redirectPort="8443"
secretRequired="false" /> ←★はまったこと2
再起動
設定変更したので再読み込みのために各サービスを再起動します。
これらの再起動は順番があるっぽいのでそれに沿って停止と起動を行っています。
[root@localhost conf]# systemctl stop httpd
[root@localhost conf]# systemctl stop tomcat
[root@localhost conf]# systemctl start tomcat
[root@localhost conf]# systemctl start httpd
接続確認
これまでの設定で、AJPの設定は完了しているので、すべてのApacheへのアクセスはTomcatに流される。
それ即ち、Apacheのテストページを開こうとすればtomcatのテストページが開かれるはず!!
なので、ゲストOSから80番ポートにアクセスしてみます。
[root@localhost conf]# curl http://localhost/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/9.0.37</title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
</head>
<body>
# 長いので割愛。
</body>
</html>
今までApacheのテストページが表示されていたものが、無事にtomcatのテストページが表示されています。
念のため、8080番ポートへのHTTPアクセスがつながらないことも確認しておきます。
[root@localhost conf]# curl http://localhost:8080
curl: (7) Failed to connect to localhost port 8080: 接続を拒否されました
こっちも想定していた通り閉じられてますね!
おわりに
以上で本記事のゴールとしていたApacheとTomcatの連携は完了です。
今回はすべてのリクエストをTomcat側に流してしまっているので、この辺りも今後の修正対象になります。
次回は、ホスト側でwarファイルを作成して、Tomcatにデプロイしてアクセスできるようにしたいと思います。