Apache HTTP Sever（Webサーバ）とApache Tomcat（APサーバ）の環境構築を行い、連携させる。

### <font color="Red">＜全体構成調整中＞</font>

# はじめに
前回はWeb三層構造への理解を深めるために、仮想マシンを3台構築し、各サーバー同士の疎通確認を行いました。
今回は仮想マシンを2台構築し、それぞれの仮想マシン上にWEBサーバとAPサーバを構築し、連携を行っていきたいと思います。
###### ①Apache HTTP Sever（Webサーバ）のインストールと設定
###### ②Apache Tomcat（APサーバ）のインストールと設定
###### ③連携が取れているかを試す。ログファイルを確認
の流れで行います。

## 事前準備
### Java 8 (JDK) ランタイムのインストール
Apache Tomcatの動作をする為には、java7以上のランタイムが必要となります。
以下のコマンドを実行してJava 8 (JDK) ランタイムをインストールします。



前回は、Web三層構造への理解を深めるために、まずは仮想マシンを3台構築し、各サーバー同士の疎通確認を行いました。
続いて、今回はWebサーヴァ

## 事前準備
### Java 8 (JDK) ランタイムのインストール
Apache Tomcatの動作をする為には、java7以上のランタイムが必要となります。
以下のコマンドを実行してJava 8 (JDK) ランタイムをインストールします。


```:実行コマンド
yum install java-1.8.0-openjdk
```
## Apache HTTP Sever（Webサーバ）のインストール

yumコマンドでインストールをします。

```:実行コマンド
yum -y install httpd
```

以下のコマンドで起動します。

```:実行コマンド
systemctl start httpd
```
以下のコマンドでサービスの状況を確認することが出来ます。
```:実行コマンド
systemctl status httpd
```
### httpd.confの設定
`httpd.conf`はApache HTTP Severの設定ファイルになります。
中身を見ると、リッスンポートの指定やサーバ名、ログの出力先等の基本設定が書かれていることがわかります。

Apache HTTP SeverはAJPというプロトコルを用いてApache Tomcatと連携を行います。
その為にはmod_proxy_ajpというモジュールを読み込めるようにする必要があります。

`httpd.conf`内56行目を確認すると、モジュールの配置する場所が書かれています。
conf.modules.dディレクトリ内の拡張子が.confのファイル
を全て読み込んでくれてることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/00902b6d-83de-f529-134e-cf854b9acfd1.png)
`/etc/httpd/conf.modules.d`ディレクトリに移動し中身を確認すると、下記confファイルがあることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/1a7bf7fa-8b14-a52d-abda-041962a37032.png)

この中の`00-proxy.conf`の中身を確認すると、
下記のように、いくつかモジュールファイルがあるのが分かります。その中でもAJPプロトコルを使うには、
- mod_proxy.so
- mod_proxy_ajp.so
の2つのモジュールファイルが必要となります。2つともあることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/34a6a1a9-0c48-32d7-118a-6ff337ae87f4.png)

### ProxyPass設定
どのようなHTTPリクエストがきたらAJPリクエストをApache Tomcatに送るのかを設定します。
`httpd.conf`の編集をします。
編集する前にオリジナルの状態でバックアップを取ります。
```:実行コマンド
cd /etc/httpd/conf
cp httpd.conf httpd.conf.`date +%Y%m%d`
```
`httpd.conf`内の最下部に以下を追記します。
ProxyPass /tomcat/ ajp://APサーバのIP:8009/test/
ProxyPassReverse /tomcat/ ajp://APサーバのIP:8009/test/


## Apache Tomcat（APサーバ）のインストール・設定


まずuseraddコマンドを使い、Tomcat を起動する為のユーザとして tomcat を登録します。
Tomcatを動かすためだけのユーザーですので、ログインシェルは/sbin/nologinに指定します。

```:実行コマンド
useradd -s /sbin/nologin tomcat
```


次に、wget コマンドで [Apache Tomcat 9 のダウンロードページ](http://tomcat.apache.org/download-90.cgi)から、Apache Tomcatの圧縮ファイルをダウンロードします（wgetコマンドは事前にyumでインストールが必要です）。
2023年1月時点ではバージョン 9.0.71 が最新版でした。
次のURLでダウンロードリンクを指定します。

```:実行コマンド
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.71/bin/apache-tomcat-9.0.71.tar.gz
```


ダウンロードした tar.gz ファイルを解凍して配置します。次のように tar コマンドで解凍し、/opt に配置します。解凍したApache Tomcatは、先ほど作成した tomcat ユーザで起動する為、所有者をtomcatに変更します。（chownコマンドに-Rオプションを付けて実行し、ディレクトリ以降も同じ権限を付与します）

```:実行コマンド
tar -xzvf ~/apache-tomcat-9.0.71.tar.gz
mv ~/apache-tomcat-9.0.71 /opt
chown -R tomcat:tomcat /opt/apache-tomcat-9.0.71
```


### systemctlコマンドで起動できるようにする
yumでインストールしてきたhttpd等ならば、systemctlコマンドから実行ができます。しかし、今回のようにダウンロードして配置したのみでは、systemctlからの実行はできません。起動できるようにするには定義ファイルの登録が必要になります。
→`/etc/systemd/system/`配下にユニットファイル
　`tomcat.service`を作成します。


```:実行コマンド
vi /etc/systemd/system/tomcat.service
```
ユニットファイルにはユニットの設定や実行するコマンドライン等を記載できます。以下を入力し、`:wq`で保存します。
```:tomcat.service
[Unit]
Description=Apache Tomcat 9
After=network.target

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

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

[Install]
WantedBy=multi-user.target
```

次のコマンドで、作成した定義ファイルの権限を 755 に変更します。
（所有者は何でもできるければ、その他のユーザーは実行と読み取りしかできないようにする）
```:実行コマンド
chmod 755 /etc/systemd/system/tomcat.service
```
`/etc/systemd/system/`配下にユニットファイルを時は、次のコマンドを実行することで設定ファイルの変更が反映されます。
```:実行コマンド
systemctl daemon-reload
```


### server.xmlの修正
Tomcat はデフォルトで8080番ポート(HTTP)と8009番ポート(AJP)での通信を受け付けています。
`sever.xml`はApache Tomcatの動作を定義する設定ファイルです。
apache HTTP SeverとApache Tomcatを連携するにあたり、sever.xmlで下記2点を修正する必要があります。

`sever.xml`は`/opt/apache-tomcat-9.0.71/conf/`配下にあります。
編集する前にオリジナルの状態でバックアップを取ります。
```:実行コマンド
cd /opt/apache-tomcat-9.0.71/conf/
cp sever.xml sever.xml.`date +%Y%m%d`
```


下記コマンドを使用し編集します。
```:実行コマンド
vi /opt/apache-tomcat-9.0.71/conf/server.xml
```
#### ①8080番ポートの停止
Apache HTTP Sever経由でのアクセスに変更する為、現状可能となっている8080ポートでのTomcatへの接続を出来ないようにコメントアウトします。
`修正前`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/95f8ef48-6bc1-5a8c-e786-d0c8772b2c83.png)
`修正後`　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/5ded2b53-ad7f-8890-407f-1412bc5f6ceb.png)

#### ②AJP1.3プロトコルの適用。8009番ポート開放
apache HTTP SeverからApache Tomcatへは`AJP/1.3`というプロトコルを使って、8009ポートでの接続を行えるようにし修正します。
下記の部分のコメントアウトを外して、iPv6の許可設定の構文も削除しました（今回は使用しない為）。
「secretRequired」を設定すると、

Connectorの属性「secretRequired」はシークレットキーの設定のようですが、今回は使用しない為、「false」へ変更します。


`修正前`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/976152ad-efe0-ce70-47f9-cd9c3d6e6d89.png)
`修正後`　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/0c15b709-59a0-dab6-1294-1e2d2b2de1c3.png)




### httpd.confの設定

### 接続テスト・通信確認
Apache HTTP Severにブラウザからアクセス、Apache Tomcatへの連携が取れているか確認。
`tail -fコマンド`を用いて、ログファイルを確認

## 振り返り（学んだこと）
##### - うまく連携できない時はログを確認してみる
/var/log/messages、access.log、error.log、catalina.out
##### - mod_proxy_ajp.soが必要となること

##### - 自身の環境に合う情報を取捨選択する

## 終わりに





# 参考
- [8080番ポートの停止とAJP/1.3プロトコルの確認](https://www.javadrive.jp/apache/tomcat/index2.html)
- [Webアプリにおけるサーバとクライアントの常識](https://atmarkit.itmedia.co.jp/ait/articles/0809/01/news162_2.html)
- [Tomcat9へのアップグレード](https://doc.support-dreamarts.com/%E3%81%B2%E3%81%B3%E3%81%8DSm@rtDB/V44/%E3%81%B2%E3%81%B3%E3%81%8DSm@rtDB_Ver.4.4_%E9%81%8B%E7%94%A8%E3%82%AC%E3%82%A4%E3%83%89/appendix/95000/index.html)
- [【Apache】httpd.conf ファイルの設定の解説](https://go-journey.club/archives/14030)
-