さっしーブログ

埼玉県在住のシステムエンジニアです。基本的には技術的な内容を中心に発信していきます。

PlayFrameworkアプリをsystemdでデーモン化しようとしたけど。。。

目次

まず初めに

今回はPlayFrameworkでデーモン化を行おうとしましたが、
最後の最後で問題が行ってしまいました。 「出来たー」な記事では無いですが、備忘録として一旦掲載しておきます。

Systemdとは

Linuxの起動処理を行う仕組みです。
Linux7以降、systemdが使われております。 それ以前のバージョンではSysvinitという仕組みでした。 Sysvinitはシェルスクリプトで記述しますが、Systemdではサービスを定義ファイルとしてUnitという単位で管理しています。

環境

※重要そうなのだけ
- Linux CentOS 7.1
- PlayFramework2.6

前提

https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box
  • Playアプリケーションルートは以下とする。
/var/www/app/SampleProject
  • rootユーザーでログイン

手順

1.アプリケーションビルド

アプリケーションルートへ移動

/var/www/app/SampleProject

2.生成されたzipを確認

/var/www/app/SampleProject/target/universal配下にZIPが生成されるので回答する。

unzip sampleproject-1.0-SNAPSHOT.zip

回答したフォルダ配下にbinフォルダがあるのでその中の「sampleproject」のファイルをパスを後述の定義ファイルに設定する。

3.Unit定義ファイルの作成

systemdはUnitという単位でサービスを管理しています。

自分で作成した定義ファイルの格納場所は以下です。

/etc/systemd/system

ちなみにデフォルト設定は以下のディレクトリにあります。 ここの設定は変更せずに上記ディレクトリにコピーして変更します。

/usr/lib/systemd/system

/etcの方が優先的に使われるので定義ファイルを/etcに配置すれば、 その定義ファイルが適用されます。

4.今回作成したUnit定義ファイル

/var/www/app/SampleProject/conf/sample.conf

ADDRESS=127.0.0.1
PORT=9000

/etc/systemd/system/play.conf

[Unit]
Description=My play app
After=network-online.target

[Service]
EnvironmentFile=/var/www/app/SampleProject/conf/vm.conf
WorkingDirectory=/var/www/app/SampleProject
ExecStart=/var/www/app/SampleProject/target/universal/sampleproject-1.0-SNAPSHOT/bin/sampleproject -Dhttp.address=${ADDRESS} -Dhttp.port=${PORT}
Restart=on-failure
User=vagrant
Group=vagrant
StartLimitBurst=0

※「ExecStart」に設定するパスは本当は生成されたzipを解凍してプロジェクト決められた場所にデプロイしてあげなきゃだと思うけど、 今回はプロジェクトフォルダ内で解凍しちゃいます。

5.パーミッション設定

定義ファイルにパーミッションを設定する。

chmod 664 /etc/systemd/system/play.service

6.再起動

systemctl daemon-reload

7.Playアプリケーション起動

systemctl start play.service

8.動作確認

http://localhost:9000

しかし、以下の内容が返却されました。

Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

どうやら調査してみるとPlayをデーモンとして起動するとApacheからPlayへリダイレクトさせるときにPlayとの接続が確立できないようです。

telnetでアクセスしてみると「sbt run」で起動したときには接続できるのに、「systemctl start play.service」で起動した時では弾かれてしまいました。。。 確かにブラウザで起動してみても「sbt run」で起動した場合には正常にレスポンスが返ってきますし。

なぜでしょう。。。 ここは引き続き調査していきます。

9.Playアプリケーション停止

ちなみにアプリケーションの停止を行う場合は以下になります。

sudo systemctl stop play.service

しかし、サービス自体は正常に起動していますのでこの問題が解消されれば、しっかりサービスとしてリリースすることができると思います。

以上