【RaspberryPi】Apache2とTomcatを連携させてみる

# 概要
TomcatをラズパイのApache2と連携させ、外部に公開、アクセスできるようにする。

# はじめに
この記事は、Raspberry Piの初期設定、ドメインの取得、Apache2の導入、ポート開放等が済んでいる前提の記事です。
お済みでない方は、先にそちらの設定を行うことを推奨します。

- [raspberry piでお手軽自家サーバー webサーバー編 - Qiita](https://qiita.com/picker/items/0466c55f9a03ebb0bd90)
- [ラズパイwebサーバをhttpsに対応させた - Qiita](https://qiita.com/HO_Pollyanna/items/aee45b25e2318d39157b)

# 使用環境
- Raspbian 10.7
- Apache 2.4.38
- Tomcat 9.0.31

## 環境構築
まずパッケージの更新をしておきます。

```console
$ sudo apt update
$ sudp apt upgrade
```
パッケージの更新が終わったらTomcatのインストールを行います。
執筆時点（2021/01/15）では`tomcat9`が最新のようです。

```console
$ sudo apt install tomcat9
```
インストールが完了したら正常に動作しているか確認します。

```console
$ curl localhost:8080
```
Apache Tomcatの情報がかえってこれば成功です。
`tomcat9`はインストールした時点で起動時に自動的に開始するようになっています。

# 各種設定
## Apache2の設定
この記事では、AJPプロトコルを使ってApacheとTomcatを連携させていきます。
似たような方法に`mod_jk`を用いた連携方法もありますが、余計なパッケージをインストールしたくないのでここでは説明しません。
[Apache + mod_jk + 各種アプリケーションサーバの設定方法](https://redj.hatenablog.com/entry/2016/12/13/033329)

まず、AJPを利用するためのモジュールを有効にします。

```console
$ sudo a2enmod proxy proxy_ajp
```
`/etc/apache2/mods-enabled`ディレクトリを確認してモジュールが有効になっているか確かめます。
`/etc/apache2/mods-enabled`ディレクトリの中に、`proxy.conf`, `proxy.load`, `proxy_ajp.load`の3つがあれば成功です。

次に、リバースプロキシの設定を行います。
root権限で`/etc/apache2/sites-available`ディレクトリに設定用の`tomcat_ajp.conf`を作成します。

```config:tomcat_ajp.conf
<VirtualHost *:80>
        # サーバーの名前
        ServerName example.com
        # サーバー管理者のメールアドレス
        ServerAdmin hogehoge@example.com

        # リバースプロキシの設定
        <Location />
                ProxyPass ajp://localhost:8009/
                ProxyPassReverse ajp://localhost:8009/
        </Location>
</VirtualHost>
```
設定ファイルが作成出来たら設定を有効にします。

```console
$ sudo a2ensite tomcat_ajp
```
同じドメインでほかにもサイトを公開している場合、ロケーションにアプリケーション名を設定するか別のドメイン・サブドメインを使って設定を分けるといいと思います。
ここでは、テストのためにほかの設定ファイルは読み込まれていないものとします。

設定を反映させるためにApacheを再起動します。

```console
$ sudo service apache2 restart
```

## Tomcat9の設定
Tomcatの設定ファイルがあるディレクトリは、`/etc/tomcat9/`, `/var/lib/tomcat9/conf/`の2つがありますが、優先されるのは`/etc/tomcat9/`に含まれる方のようなので、そちらを編集します。
上手くいかない場合は、`/var/lib/tomcat9/conf/`の方を変更してみてください。

`/etc/tomcat9/server.xml`を編集していきます。
まず、直接Tomcatにアクセスができなくするため、デフォルトの8080ポートの部分をコメントアウトします。

```xml:server.xml
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
```
次に8009ポートの部分を編集します。コメントアウトが付いている場合は外してください。
AJPコネクタが信頼できないサイトと接続できないようにするために`secretRequired`オプションを追記します。

```xml:server.xml
    <Connecter protocol="AJP/1.3"
               address="::1"
               port="8009"
               secretRequired="false"
               redirectPort="8443" />
```

設定を反映させるためにTomcatを再起動します。

```console
$ sudo service tomcat9 restart
```
ポート8080が閉じているか確認します。

```console
$ curl localhost:8080
```
接続が拒否されれば成功です。

## 動作確認
まず、ラズパイ上のブラウザで設定したサーバー名にアクセスします。
Tomcatのルートページが表示されれば成功です。

別の端末のブラウザでも表示されるか確かめます。
アクセスがうまくいかない場合はポート開放、ファイアウォールの設定などを見直してみてください。

お疲れ様でした。

# 参考
- [RaspberryPi に Tomcat をインストール - Qiita](https://qiita.com/ekzemplaro/items/b6dd39daeb027227234d)
- [ApacheとTomcatを連携させる - Qiita](https://qiita.com/nkojima/items/7a8dd5c5e1d3c032178c)
- [Ubuntu 19.10 Eoan Ermine に Apache Tomcat 9 をインストールして Hello World - Qiita](https://qiita.com/niwasawa/items/2b8fdc90a8e47e641d4d)
- [Apache httpd と Tomcat を連携させる方法](https://weblabo.oscasierra.net/tomcat-mod-proxy-ajp/)
- [Apache+Tomcatのインストールと連携設定](http://sakusaku-techs.com/apache-tomcat/apche-connect/#ApacheTomcat-2)