Spring BootのFully Executable Jarをサーバにリリースする方法

2016/06/25

Spring Bootはバージョン1.3.0以降、Executable JarとしてJarファイルに固めるだけでなく、実行スクリプトがJarファイル内に埋め込まれたFully Executable Jarが作成できる。
サーバに常駐させるため、普通のJarファイルであれば起動スクリプトを書く必要があるが、Fully Executable Jarであれば不要となる。
通常のJarファイルの起動スクリプトが公式に提供されていない状況だが、Fully Executable Jarの登場によって、実質的に起動スクリプトが公式に提供されたことになる。
これによって、簡単にserviceコマンドでアプリをdeamon起動することができるようになった。

ここでは、ビルド方法と次の環境にリリースする場合の構築手順と解説を記載する。
※基本はhttp://docs.spring.io/spring-boot/docs/1.3.5.RELEASE/reference/htmlsingle/#deployment-installに書いてある通り。

目次

環境
ビルド方法
構築手順
解説

環境

CentOS 6.8
Java8
Spring Boot 1.3.5
アプリ名:myapp.jar
アプリ用ユーザ名:myappusr

ビルド方法

pom.xmlにspring-boot-maven-pluginというbuildプラグインを追加し、executableをtrueにする。
falseを設定するとExecutable Jarファイルを作成し、trueを設定するとFully Executable Jarファイルを作成してくれる。

構築手順

解説

※1)myapp.jarの所有者がmyapp.jarの実行ユーザになるので、rootではなくアプリ用ユーザにする。

http://docs.spring.io/spring-boot/docs/1.3.5.RELEASE/reference/htmlsingle/#deployment-initd-service-securingにセキュリティ面を考慮した設定方法が列挙されている。
次の二点は、構築手順で達成できている。
・myapp.jarの所有者をrootからmyappusrに変更する
・myapp.jarの権限を500に変更する
・myapp.confの所有者をrootにする(rootで構築しているため、自動で所有者がrootになっている)

しかし、それ以外は行っていないので、必要に応じてセキュリティを高めていく必要がある。
・myappusrのシェルを/usr/sbin/nologinにする
・jarファイルにchattr +i
・confファイルにchmod 400

※2)jarファイルと同名のconfファイルを作成し、環境変数やJVMに渡すパラメータを設定する。

jarファイルと同じディレクトリに同名のconfファイルを置くと、起動時に読み込んでくれる。
読み込む方法は、jarファイルの初めの部分がシェルスクリプトになっているので、jarファイルをlessして見るとわかる。

source "${jarfolder}/${configfile}"となっているため、環境変数を設定したければexportを、JVMに渡す引数を設定したければJAVA_OPTSに値を設定すればいい。

今回は以下の二つを設定した。

JAVA_OPTS="-Dspring.profiles.active=development"

Spring Bootの実行環境をJVM引数で渡すことができ、propertiesファイルの切り替え等ができるため、おそらくどのプロジェクトでも必要になる引数だろう。
開発環境であればdevelopment、ステージング環境であればstaging、本番環境であればproductionなどの引数を渡す。

export LANG="ja_JP.UTF-8"

文字コードを設定した理由は、今回の環境がCentOSというところにある。
/etc/init.dにあるスクリプトを直接実行する場合と異なり、manによれば、serviceコマンドで実行するとプログラムを起動する際に環境変数LANGとTERM以外が引き継がれない。

ENVIRONMENT
LANG, TERM
The only environment variables passed to the init scripts.

しかし、CentOSではこの記述が当てはまらず、LANGも引き継がれない。
原因は/sbin/serviceスクリプトを見るとわかるが、env -iで環境変数をクリアしており、LANGを再設定してないから。
参考:http://heartbeats.jp/hbblog/2013/06/service-start-stop.html

LANG="ja_JP.UTF-8"が設定されないと、Javaが日本語のファイルを扱う際に文字化けを起こしてしまうため、RedHatやFedoraも含めCentOS系のディストリを使用する場合は、confファイル内でLANG変数をexportしなければならない。
Ubuntu系を使用する場合でも、LANGの設定があることでバグを起こすわけではないので、一律この設定を入れてもいいかもしれない。

他にもconfファイルで設定できる項目はたくさんあるので、公式ドキュメントを確認してほしい。
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-script-customization

※3)ログ確認
※4)PID確認

ログファイルとPIDファイルは所定の場所に出力される。あらかじめPIDファイルが格納されるディレクトリを作る必要はない。
出力場所を変えたければconfファイルで設定ができる。

-Java, Linux
-