サービスとしてのSpringBootアプリケーション
1. 概要
この記事では、SpringBootアプリケーションをサービスとして実行するためのいくつかのオプションについて説明します。
まず、Webアプリケーションのパッケージオプションとシステムサービスについて説明します。 以降のセクションでは、Windowsベースのシステムとして両方のLinuxのサービスをセットアップするときに使用できるさまざまな代替案について説明します。
最後に、追加の情報源へのいくつかの参照で締めくくります。
2. プロジェクトのセットアップとビルドの手順
2.1. 包装
Webアプリケーションは、従来、Webアプリケーションアーカイブ(WAR)としてパッケージ化され、Webサーバーにデプロイされていました。
Spring Bootアプリケーションは、WARファイルとJARファイルの両方としてパッケージ化できます。 後者は、JARファイル内にWebサーバーを埋め込みます。これにより、アプリケーションサーバーのインストールや構成を必要とせずにアプリケーションを実行できます。
2.2. Maven構成
pom.xmlファイルの構成を定義することから始めましょう。
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>
<dependencies>
....
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
パッケージはjarに設定する必要があります。 執筆時点では、最新の安定バージョンのSpring Bootを使用していますが、1.3以降のバージョンで十分です。 利用可能なバージョンの詳細については、ここを参照してください。
を設定したことに注意してください
2.3. アプリケーションの構築
アプリケーションのルートディレクトリ内で次のコマンドを実行します。
$ mvn clean package
これで、実行可能JARファイルが target ディレクトリで利用可能になり、コマンドラインで次のコマンドを実行してアプリケーションを起動できます。
$ java -jar your-app.jar
この時点でも、-jarオプションを指定してJavaインタープリターを呼び出す必要があります。 アプリをサービスとして呼び出すことができるようにしてアプリを起動することが望ましい理由はたくさんあります。
3. Linuxの場合
プログラムをバックグラウンドプロセスとして実行するには、 nohup Unixコマンドを使用するだけですが、さまざまな理由から、これは推奨される方法ではありません。 このスレッドで適切な説明が提供されています。
代わりに、プロセスをデーモン化します。 Linuxでは、従来の System VinitスクリプトまたはSystemd構成ファイルのいずれかを使用してデーモンを構成することを選択できます。 前者は伝統的に最もよく知られているオプションですが、徐々に後者に取って代わられています。
この違いの詳細については、こちらをご覧ください。
セキュリティを強化するために、最初にサービスを実行する特定のユーザーを作成し、それに応じて実行可能JARファイルのアクセス許可を変更します。
$ sudo useradd baeldung
$ sudo passwd baeldung
$ sudo chown baeldung:baeldung 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コマンドをサポートしています。 さらに:
- 作成したばかりのユーザーbaeldungで実行されているサービスを開始します
- /var/run/your-app/your-app.pidでアプリケーションのプロセスIDを追跡します
- コンソールログを/var/log/your-app.logに書き込みます。これは、アプリケーションが正しく起動しない場合に確認する必要があります。
3.2. Systemd
systemdサービスのセットアップも非常に簡単です。 まず、次の例を使用して your-app.service という名前のスクリプトを作成し、 / etc / systemd /systemディレクトリに配置します。
[Unit]
Description=A Spring Boot application
After=syslog.target
[Service]
User=baeldung
ExecStart=/path/to/your-app.jar SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
アプリケーションに一致するように、 Description 、 User 、およびExecStartフィールドを変更することを忘れないでください。 この時点でも、前述の標準サービスコマンドを実行できるはずです。
前のセクションで説明したSystemV init アプローチとは対照的に、プロセスIDファイルとコンソールログファイルは、サービススクリプトの適切なフィールドを使用して明示的に構成する必要があります。 オプションの完全なリストはここにあります。
3.3. アップスタート
Upstart は、イベントベースのサービスマネージャーであり、 System V init の代替となる可能性があり、さまざまなデーモンの動作をより詳細に制御できます。
このサイトには、ほとんどすべてのLinuxディストリビューションで機能する優れたセットアップ手順があります。 Ubuntuを使用する場合は、Ubuntuがすでにインストールおよび構成されている可能性があります( / etc / init に「upstart」で始まる名前のジョブがあるかどうかを確認してください)。
SpringBootアプリケーションを起動するためのジョブ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
「startyour-app」を実行すると、サービスが開始されます。
Upstartには多くのジョブ構成オプションがあり、それらのほとんどはここにあります。
4. Windowsの場合
このセクションでは、JavaJARをWindowsサービスとして実行するために使用できるいくつかのオプションを紹介します。
4.1. Windowsサービスラッパー
Java Service Wrapper (次のサブセクションを参照)のGPLライセンスに問題があるため、 JenkinsのMITライセンスであるWindowsService Wrapper プロジェクト( winsw とも呼ばれます)が考案されました。
Winsw は、サービスをインストール/アンインストール/開始/停止するためのプログラム的な手段を提供します。 さらに、Windowsでサービスとしてあらゆる種類の実行可能ファイルを実行するために使用できますが、Java Service Wrapperは、その名前が示すように、Javaアプリケーションのみをサポートします。
まず、バイナリここをダウンロードします。 次に、Windowsサービスを定義する構成ファイルMyApp.xmlは次のようになります。
<service>
<id>MyApp</id>
<name>MyApp</name>
<description>This runs Spring Boot as a Service.</description>
<env name="MYAPP_HOME" value="%BASE%"/>
<executable>java</executable>
<arguments>-Xmx256m -jar "%BASE%\MyApp.jar"</arguments>
<logmode>rotate</logmode>
</service>
最後に、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でプロセスをサービスとして実行する方法を指定する構成ファイルで指定する必要もあります。
この記事では、WindowsでJARファイルの実行をサービスとして設定する方法を非常に詳細に説明しているため、情報を繰り返す必要はありません。
5. その他の参考資料
Spring Bootアプリケーションは、 Apache CommonsDaemonプロジェクトのProcrunを使用してWindowsサービスとして開始することもできます。 Procrunは、WindowsユーザーがJavaアプリケーションをWindowsサービスとしてラップできるようにするアプリケーションのセットです。 このようなサービスは、マシンの起動時に自動的に開始され、ユーザーがログオンしていなくても実行を継続するように設定できます。
UnixでのSpringBootアプリケーションの起動の詳細については、こちらを参照してください。 Redhatベースのシステム用にSystemdユニットファイルを変更する方法の詳細な手順もあります。 ついに
最後に、この簡単なハウツーでは、BashスクリプトをJARファイルに組み込んで、それ自体が実行可能ファイルになる方法について説明します。
6. 結論
サービスを使用すると、アプリケーションの状態を非常に効率的に管理できます。これまで見てきたように、SpringBootアプリケーションのサービスセットアップはこれまでになく簡単になりました。
サービスを実行するためのユーザー権限に関する重要で単純なセキュリティ対策に従うことを忘れないでください。