サービスとしてのSpring Bootアプリケーション
1. 概要
この記事では、Spring Bootアプリケーションをサービスとして実行するいくつかのオプションについて説明します。
まず、Webアプリケーションのパッケージオプションとシステムサービスについて説明します。 後続のセクションでは、LinuxをWindowsベースのシステムとして両方のサービスをセットアップする際に、さまざまな代替手段を検討します。
最後に、追加の情報源へのいくつかの参照で締めくくります。
2. プロジェクトのセットアップとビルドの手順
2.1. パッケージング
Webアプリケーションは従来、WebアプリケーションaRchives(WAR)としてパッケージ化され、Webサーバーにデプロイされていました。
Spring Bootアプリケーションは、WARファイルとJARファイルの両方としてパッケージ化できます。 後者は、JARファイル内にWebサーバーを埋め込みます。これにより、アプリケーションサーバーをインストールおよび構成する必要なく、アプリケーションを実行できます。
2.2. Mavenの構成
pom.xmlファイルの構成を定義することから始めましょう。
jar
org.springframework.boot
spring-boot-starter-parent
1.4.0.RELEASE
....
org.springframework.boot
spring-boot-maven-plugin
true
パッケージはjarに設定する必要があります。 執筆時点では、Spring Bootの最新の安定バージョンを使用していますが、1.3以降のバージョンであれば十分です。 利用可能なバージョンhereに関する詳細情報を見つけることができます。
spring-boot-maven-pluginアーティファクトの<executable>パラメータをtrueに設定していることに注意してください。 これにより、MANIFEST.MFファイルがJARパッケージに確実に追加されます。 このマニフェストには、アプリケーションのメインメソッドを定義するクラスを指定するMain-Classエントリが含まれています。
2.3. アプリケーションの構築
アプリケーションのルートディレクトリ内で次のコマンドを実行します。
$ mvn clean package
これで、実行可能JARファイルがtargetディレクトリで利用可能になり、コマンドラインで次のコマンドを実行してアプリケーションを起動できます。
$ java -jar your-app.jar
この時点でも、-jarオプションを指定してJavaインタープリターを呼び出す必要があります。 アプリをサービスとして起動できるようにして、アプリを起動することが望ましい理由はたくさんあります。
3. Linuxの場合
プログラムをバックグラウンドプロセスとして実行するには、nohup Unixコマンドを使用するだけですが、さまざまな理由から、これは推奨される方法ではありません。 このthreadには適切な説明があります。
代わりに、プロセスをdaemonizeします。 Linuxでは、従来のSystem V initスクリプトまたはSystemd構成ファイルのいずれかを使用してデーモンを構成することを選択できます。 前者は伝統的に最も有名なオプションですが、徐々に後者に置き換えられています。
この違いhereの詳細を見つけることができます。
セキュリティを強化するために、まず特定のユーザーを作成してサービスを実行し、それに応じて実行可能なJARファイルのアクセス許可を変更します。
$ sudo useradd example
$ sudo passwd example
$ sudo chown example:example your-app.jar
$ sudo chmod 500 your-app.jar
3.1. System V Init
Spring Boot実行可能JARファイルにより、サービスのセットアッププロセスが非常に簡単になります。
$ sudo ln -s /path/to/your-app.jar /etc/init.d/your-app
上記のコマンドは、実行可能JARファイルへのシンボリックリンクを作成します。 実行可能JARファイルへのフルパスを使用する必要があります。そうしないと、シンボリックリンクが正しく機能しません。 このリンクにより、アプリケーションをサービスとして開始できます。
$ sudo service your-app start
このスクリプトは、標準サービスのstart、stop、restart、およびstatusコマンドをサポートしています。 さらに:
-
作成したばかりのユーザーexampleで実行されているサービスを開始します
-
アプリケーションのプロセスIDを/var/run/your-app/your-app.pidで追跡します
-
コンソールログを/var/log/your-app.logに書き込みます。これは、アプリケーションが正しく起動しない場合に確認する必要があります。
3.2. システム化
systemdサービスのセットアップも非常に簡単です。 まず、次の例を使用してyour-app.serviceという名前のスクリプトを作成し、/etc/systemd/systemディレクトリに配置します。
[Unit]
Description=A Spring Boot application
After=syslog.target
[Service]
User=example
ExecStart=/path/to/your-app.jar SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
アプリケーションに一致するように、Description、User、およびExecStartフィールドを変更することを忘れないでください。 この時点でも、前述の標準サービスコマンドを実行できるはずです。
前のセクションで説明したSystem V initアプローチとは対照的に、プロセスIDファイルとコンソールログファイルは、サービススクリプトの適切なフィールドを使用して明示的に構成する必要があります。 オプションの完全なリストはhereにあります。
3.3. 新興企業
Upstartは、イベントベースのサービスマネージャーであり、System V initの代替となる可能性があり、さまざまなデーモンの動作をより細かく制御できます。
このサイトには、ほとんどすべてのLinuxディストリビューションで機能するはずの優れたsetup instructionsがあります。 Ubuntuを使用する場合は、おそらくすでにインストールおよび構成されています(/etc/initに「upstart」で始まる名前のジョブがあるかどうかを確認してください)。
Spring Bootアプリケーションを起動するジョブyour-app.confを作成します。
# Place in /home/{user}/.config/upstart
description "Some Spring Boot application"
respawn # attempt service restart if stops abruptly
exec java -jar /path/to/your-app.jar
「start your-app」を実行すると、サービスが開始されます。
Upstartには多くのジョブ構成オプションがあり、それらのほとんどはhereです。
4. Windowsの場合
このセクションでは、Java JARをWindowsサービスとして実行するために使用できるオプションをいくつか紹介します。
4.1. Windowsサービスラッパー
Java Service Wrapper(次のサブセクションを参照)のGPLライセンスの問題により、 JenkinsのMITライセンスであるWindows Service Wrapperプロジェクトは、winswとしても知られています。
Winswは、サービスをインストール/アンインストール/開始/停止するためのプログラム的な手段を提供します。 さらに、Windowsで任意の種類の実行可能ファイルをサービスとして実行するために使用できますが、Java Service Wrapperはその名前が示すように、Javaアプリケーションのみをサポートします。
まず、バイナリhereをダウンロードします。 次に、WindowsサービスMyApp.xmlを定義する構成ファイルは次のようになります。
MyApp
MyApp
This runs Spring Boot as a Service.
java
-Xmx256m -jar "%BASE%\MyApp.jar"
rotate
最後に、winsw.exeの名前をMyApp.exeに変更して、その名前がMyApp.xml構成ファイルと一致するようにする必要があります。 その後、次のようにサービスをインストールできます。
$ MyApp.exe install
同様に、uninstall、start、stopなどを使用できます。
4.2. Java Service Wrapper
Java Service WrapperプロジェクトのGPLライセンスを気にしない場合、この代替手段は、JARファイルをWindowsサービスとして同様に構成する必要性に対処する可能性があります。 基本的に、Java Service Wrapperでは、Windowsでプロセスをサービスとして実行する方法を指定する構成ファイルで指定する必要もあります。
This articleは、WindowsでJARファイルの実行をサービスとして設定する方法を非常に詳細に説明しているため、情報を繰り返す必要はありません。
5. その他の参考資料
Spring Bootアプリケーションは、Apache Commons DaemonプロジェクトのProcrunを使用してWindowsサービスとして起動することもできます。 Procrunは、WindowsユーザーがJavaアプリケーションをWindowsサービスとしてラップできるようにするアプリケーションのセットです。 このようなサービスは、マシンの起動時に自動的に開始するように設定され、ユーザーがログオンしなくても実行を継続します。
UnixでSpringBootアプリケーションを起動する方法の詳細については、hereを参照してください。 Systemd unit files for Redhatベースのシステムを変更する方法についての詳細な説明もあります。 最後に
最後に、this quick howtoは、BashスクリプトをJARファイルに組み込んで、それ自体が実行可能ファイルになる方法を説明しています。
6. 結論
サービスを使用すると、アプリケーションの状態を非常に効率的に管理できます。また、これまで見てきたように、Spring Bootアプリケーションのサービスセットアップがこれまでになく簡単になりました。
サービスを実行するためのユーザー権限に関する重要でシンプルなセキュリティ対策に従うことを忘れないでください。