AJPでApache 2.4とApache Tomcat 9.0を連携させる

概要

今回は、VirtualBoxの仮想マシン(CentOS8)にインストールしたApacheとTomcatを、AJPで連携させてみようと思います。仮想マシンが用意されていることが前提で、TomcatやApacheのインストールからの手順をまとめていきます。

環境

  • VirtualBox 6.1.16
  • ゲストOS(CentOS 8.2.2004)
  • Java 1.8.0_272
  • Apache Tomcat 9.0.39
  • Apache 2.4.37

Tomcat

Java実行環境のインストール

TomcatはJava言語のアプリケーションなので、動作させるためにJavaの実行環境をインストールします。

# dnf install java-1.8.0-openjdk

Tomcatのインストール

実行環境が整ったので、さっそくTomcatをインストールしていきます。まずは/tmpに移動します。

# cd /tmp

/tmpは時間が経つと中身が消えるため、とりあえずファイルを置いておきたい時に最適なディレクトリです。

Tomcatはダウンロードサイトからリンクを入手し、wgetでダウンロードします。そのあと、tarコマンドが-Cで指定した/optにファイルを展開します。

# wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.39/bin/apache-tomcat-9.0.39.tar.gz

# ll
-rw-r--r--  1 root root 819200 11月  6 21:02 apache-tomcat-9.0.39.tar.gz

# tar -zxvf apache-tomcat-9.0.39.tar.gz -C /opt

# cd /opt

# ll
drwxr-xr-x 9 root root 220 11月  6 21:22 apache-tomcat-9.0.39

ちなみに/optは、パッケージ管理以外でインストールしたアプリケーションソフトウェアを配置する場所としてFHSで定められています。

次は、Tomcatの実行ユーザを作っていくのですが、デフォルトシェルに/sbin/nologinを指定しています。なぜなら、このユーザはサービスの実行ユーザとしてしか使わないからです。

# useradd -s /sbin/nologin tomcat

tomcatというユーザを作成したので、実行ユーザとグループの所有権を変更します。

# chown -R tomcat:tomcat apache-tomcat-9.0.39

systemdのユニットファイル作成

Tomcatはパッケージ管理システムを使用せず、外部からダウンロードしてきたので、ユニットファイルが作成されていません。ユニットファイルが作成されていないと、systemctlを使った処理ができないため、自分で作成する必要があります。

# vi /etc/systemd/systemc/tomcat.service
[Unit]
Description=Apache Tomcat 9
After=network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/apache-tomcat-9.0.36/tomcat.pid
RemainAfterExit=true

ExecStart=/opt/apache-tomcat-9.0.36/bin/startup.sh
ExecStop=/opt/apache-tomcat-9.0.36/bin/shutdown.sh
ExecReStart=/opt/apache-tomcat-9.0.36/bin/shutdown.sh;/opt/apache-tomcat-9.0.36/bin/startup.sh

[Install]
WantedBy=multi-user.target

10.6. SYSTEMD のユニットファイルの作成および変更を参考にし、この設定ファイルで登場するセクションとオプションの説明をまとめます。

セクションオプション説明
UnitDescriptionユニットの説明
After指定したユニットのアクティブ後にアクティブ
ServiceUser実行ユーザ
Group実行グループ
Typeサービス起動の種類を指定
PIDFILEPIDファイルへのパス
RemainAfterExitサービスのプロセスが全て終了してもアクティブ
ExecStartユニット開始時に実行するコマンド
ExecStopユニット停止時に実行するコマンド
ExecReStartユニット再起動時に実行するコマンド
InstallWantedBy依存関係を表す

正直このドキュメント読んでもよくわからず、、。以下の記事がとても参考になりました。

参考: systemdによる自動起動 | そう備忘録

完成したら、他の多くのサービスと同様にパーミッションを755に設定します。

# ll /etc/systemd/system/tomcat.service
-rw-r--r--  1 root root  406 11月  6 21:35 tomcat.service

# chmod 755 /etc/systemd/system/tomcat.service 

# ll /etc/systemd/system/tomcat.service
-rwxr-xr-x 1 root root 406 11月  6 21:35 /etc/systemd/system/tomcat.service

あとはユニットファイルを認識させ、自動起動の設定をしておしまいです。

# systemctl daemon-reload

# systemctl list-unit-files | grep tomcat     
tomcat.service                             disabled 

# systemctl enable tomcat

server.xmlの設定変更

まずは変更する前に一応バックアップを取っておきます。

# cd apache-tomcat-9.0.39/conf
# ll
-rw------- 1 tomcat tomcat  12873 10月  6 23:17 catalina.policy
-rw------- 1 tomcat tomcat   7262 10月  6 23:17 catalina.properties
-rw------- 1 tomcat tomcat   1400 10月  6 23:17 context.xml
-rw------- 1 tomcat tomcat   1149 10月  6 23:17 jaspic-providers.xml
-rw------- 1 tomcat tomcat   2313 10月  6 23:17 jaspic-providers.xsd
-rw------- 1 tomcat tomcat   4144 10月  6 23:17 logging.properties
-rw------- 1 tomcat tomcat   7588 10月  6 23:17 server.xml
-rw------- 1 tomcat tomcat   2164 10月  6 23:17 tomcat-users.xml
-rw------- 1 tomcat tomcat   2558 10月  6 23:17 tomcat-users.xsd
-rw------- 1 tomcat tomcat 172359 10月  6 23:17 web.xml
# cp -p server.xml server.xml.`date +%Y%m%d`
# ll
-rw------- 1 tomcat tomcat  12873 10月  6 23:17 catalina.policy
-rw------- 1 tomcat tomcat   7262 10月  6 23:17 catalina.properties
-rw------- 1 tomcat tomcat   1400 10月  6 23:17 context.xml
-rw------- 1 tomcat tomcat   1149 10月  6 23:17 jaspic-providers.xml
-rw------- 1 tomcat tomcat   2313 10月  6 23:17 jaspic-providers.xsd
-rw------- 1 tomcat tomcat   4144 10月  6 23:17 logging.properties
-rw------- 1 tomcat tomcat   7588 10月  6 23:17 server.xml
-rw------- 1 tomcat tomcat   7588 10月  6 23:17 server.xml.20201106
-rw------- 1 tomcat tomcat   2164 10月  6 23:17 tomcat-users.xml
-rw------- 1 tomcat tomcat   2558 10月  6 23:17 tomcat-users.xsd
-rw------- 1 tomcat tomcat 172359 10月  6 23:17 web.xml

では以下のように編集していきます。diffコマンドで表示した通り、コメントアウトを外して有効にし、address=”::1″の部分を削除しています。secretRequiredの行を追記していることにも注意です。

# vi server.xml
--------(省略)----------
<!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector protocol="AJP/1.3"          
               port="8009"
               secretRequired="false"
               redirectPort="8443" />        


# diff server.xml server.xml.20201106 
115a116
>     <!--
116a118
>                address="::1"
118d119
<                secretRequired="false"
119a121
>     -->

なぜここを有効にしたかというと、今回ApacheとTomcatはAJP(Apache JServ Protocol)というプロトコルを用いて通信を行い、その際8009番ポートを使用するからです。

動作確認

Tomcatは8080番ポートで簡易的なWebサーバを動作させているので、これで動作確認をしてみます。

まずは、一時的にファイアーウォールの8080番ポートを開放し、tomcatを起動させます。

# firewall-cmd --add-port=8080/tcp 
# systemctl start tomcat

URLに<IPアドレス>:8080と入力して、このような画面が表示されれば問題ないです。

最後にリロードして、一時的に開放した8080番ポートを塞ぎます。

# firewall-cmd --reload
# systemctl restart tomcat

Apache

さくっとインストールして、ファイアウォールの設定をします。

# dnf install httpd

# firewall-cmd --add-service=http --zone=public --permanent
success

# firewall-cmd --add-service=https --zone=public --permanent
success

# firewall-cmd --reload
success

# systemctl enable httpd --now

URLにIPアドレスを打ち込み、テストページが表示されれば問題なしです。

ApacheとTomcatの連携

ではここから連携のための設定変更を行っていきます。

Apacheモジュールの確認

ApacheとTomcatが連携するためには、以下の二つのモジュールが必要です。

mod_proxy.soApacheのプロキシの仕組みを提供
mod_proxy_ajp.soAJPによるApacheとTomcatの接続を提供

この二つはデフォルトでApacheに提供されているものなので、一応ロードされているか確認します。

# less /etc/httpd/conf.modules.d/00-proxy.conf
LoadModule proxy_module modules/mod_proxy.so
--------(省略)---------
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
--------(省略)---------

リバースプロキシの設定

ここでは、URLの中に特定の文字列があれば、それをTomcatに転送する仕組みを設定します。

以下の設定では、http://IPアドレス/tomtom9/ にアクセスすると、8009番ポートの/に転送されるようにしています。

# vi /etc/httpd/conf.d/tomcat.conf
ProxyPass /tomtom9 ajp://localhost:8009/

Tomcatの設定

動作確認の前に、Tomcatの8080番ポートは使わないので、コメントアウトして無効化します。そのあとApacheとTomcatを再起動させます。

# vi server.xml
 <!-- <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" /> -->
# systemctl restart httpd tomcat

動作確認

では、両者が連携しているかどうか確認していきます。

http://IPアドレス/tomtom9/にアクセスすると、

このようにTomcatの管理画面(8009番ポートの/)を表示することができました。

最後に閉鎖した8080番ポートにアクセスできないことを確認してみます。

無事確認できたので、これにてApacheとTomcatの連携の設定は終了です。

Comment

タイトルとURLをコピーしました