目次
まず初めに
今回はPlayFrameworkでデーモン化を行おうとしましたが、
最後の最後で問題が行ってしまいました。
「出来たー」な記事では無いですが、備忘録として一旦掲載しておきます。
Systemdとは
Linuxの起動処理を行う仕組みです。
Linux7以降、systemdが使われております。
それ以前のバージョンではSysvinitという仕組みでした。
Sysvinitはシェルスクリプトで記述しますが、Systemdではサービスを定義ファイルとしてUnitという単位で管理しています。
環境
※重要そうなのだけ
- Linux CentOS 7.1
- PlayFramework2.6
前提
- VMは「http://www.vagrantbox.es/」から以下を使用しました。
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
しかし、サービス自体は正常に起動していますのでこの問題が解消されれば、しっかりサービスとしてリリースすることができると思います。
以上