パッケージングを War にした場合

昨日の記事である Spring Boot を Kotlin で Hello Worldパッケージングを Jar でなく War でプロジェクトを新規作成した状態とする。 build.gradle の記述が少し変わるのだが、具体的には以下の部分だ:

apply plugin: 'war'

configurations {
    providedRuntime
}

dependencies {
    // ここをコメントアウトして Application を実行すると組み込みの Tomcat で実行できる
    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
}

上記に書いた通り providedRuntime('org.springframework.boot:spring-boot-starter-tomcat') をコメントアウトすれば普通に Jar でビルドし組み込みの Tomcat で実行できる。 開発時はコメントアウトしておくのがいいだろう。 尚 War でプロジェクト作成した場合 ServletInitializer というクラスが増えているのが分かると思うが、これが無いと Tomcat で war ファイルをデプロイしても実行できない。

war ファイル作成

上記の状態で普通に Gradle のビルドを行うと build/libs 直下に war ファイルが作成される。 尚ファイル名は (プロジェクト名)-(Gradle に指定している version).war となるようだ。

Ubuntu 側の用意

今回はローカルの仮想環境に Ubuntu Server 16.04.3 LTS をセットアップしてあるものとする。 後今回は便宜上 Oracle の Java ではなく OpenJDK とする。

sudo apt install apache2 openjdk-8-jdk tomcat8 tomcat8-admin

これで Tomcat がインストールできたので http://(仮想環境の IP):8080/ にアクセスし Tomcat の稼働を意味するスタートページが表示されることを確認する。 仮想環境の場合ネットワークの設定を「ブリッジアダプタ」などホスト PC から IP が見える状態にしておかないといけないので注意する。

tomcat8-admin をインストールしたので http://(仮想環境の IP):8080/manager にアクセスすると Tomcat 管理画面に遷移することができるが、最初の認証の為のユーザを設定しなければならない。

sudo vi /etc/tomcat8/tomcat-users.xml

以下を追記する。 ユーザ名とパスワードは適宜強固なものに変更する。

<tomcat-users>
    ...
    <user username="admin" password="admin" roles="manager-gui,admin-gui"/>
</tomcat-users>

Tomcat を再起動し設定を反映する:

sudo service tomcat8 restart

これで http://(仮想環境の IP):8080/manager にアクセスし設定したユーザ名とパスワードを入力し認証、正しく管理画面が表示されるのを確認する。 更に管理画面上から前述の手順で作成した war ファイルをデプロイし、正しくアプリケーションのページが表示されるのを確認する。

Apache との連携

これは UbuntuでTomcat Apache連携がとても参考になった。 ほぼ記事のオウム返しになって恐縮であるが、まず以下で Tomcat の接続設定を変更する:

sudo vi /etc/tomcat8/server.xml

8080 ポートを閉じて proxy_ajp 連携用の 8009 版ポートを開く:

<!-- コメントアウト
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="UTF-8"
           redirectPort="8443" />
-->

<!-- コメントアウトを外す -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

次に sudo vi /etc/apache2/sites-available/000-default.conf し以下追記する:

<Location />
    ProxyPass ajp://localhost:8009/
    Order allow,deny
    Allow from all
</Location>

最後に proxy_ajp を有効にしそれぞれ再起動:

sudo a2enmod proxy_ajp
sudo service tomcat8 restart
sudo service apache2 restart

http://(仮想環境の IP)/(コンテキスト名) にアクセスし、正しく Spring Boot アプリケーションが表示されるのを確認する。 /etc/apache2/conf-available の方に設定を書いて sudo a2enconf xxx する方法もあるが、個人的にはバーチャルホストで設定を分ける時に今回記載した手順のほうが便利だと思った。