しがないPGの自衛記録

基本ずっと寝てる

Apache HTTP ServerとApache Tomcatを連携させる

f:id:ashitaka1963:20200816102215p:plain

はじめに

前回VirtualBox上のLinux環境でTomcatを動かすことができたので、今回はApache HTTP ServerとApache Tomcatを連携したいと思います。

連携した後の処理としては、ユーザーからのリクエストはApacheで受けとり、そのリクエストの内容が動的な処理が必要であればTomcatに処理を流すといったものになります。

目次

本記事のゴール

なお、本記事はApache httpd と Tomcat を連携させる方法 |を参考にさせていただきました。

環境

事前知識

Apache(Webサーバ)とTomcat(Webコンテナ)を併用するメリット

  • TomcatにもApacheと同様にWebサーバとしての機能を持っている。
  • しかし、Webサーバの専門家のApacheに比べると機能が劣ってしまう。
  • なので、Tomcatが苦手な部分はApacheに任せるために併用する感じ!

AJPApache JServ Protocol)

環境構築手順

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_ajpmod_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: 接続を拒否されました

こっちも想定していた通り閉じられてますね!

おわりに

以上で本記事のゴールとしていたApacheTomcatの連携は完了です。 今回はすべてのリクエストをTomcat側に流してしまっているので、この辺りも今後の修正対象になります。

次回は、ホスト側でwarファイルを作成して、Tomcatにデプロイしてアクセスできるようにしたいと思います。

参考サイト