SupervisorでGolangで書かれたアプリケーションのデーモン化をした話
今回は前回の記事に関連してGoで書かれたアプリケーションをSupervisorを使ってデーモン化した時の話を書いていきたい思います。
はじめに
開発環境
- CentOS 7.3
- Go 1.8
- Supervisor 3.3.3
前提条件
Goのアプリケーションがデプロイされている、 go build
したバイナリがある
Supervisorとは
そもそもSupervisorってなんぞや?っていう人もいると思うので説明します。
Supervisorはpythonで書かれているプロセス管理ツールです。
Supervisorは設定ファイルをちょこっと書くだけで簡単にデーモンプロセスの生成ができるのでとても楽です。
Supervisor: A Process Control System — Supervisor 3.3.3 documentation
インストール
yumでインストールしておきましょう
yum install supervisor
設定ファイルに新しく追加する
Supervisorがinstallされると /etc/supervisord.conf
が作成されています。これが設定ファイルなので編集していきましょう。
設定ファイルの中にはsupervisor自身の設定も含まれています。
早速ですが、これが完成形です。詳しい内容については後述していきます。
※ 今回はSupervisor自身の設定は省きます。
;/etc/supervisord.conf [unix_http_server] file = /run/supervisor.sock chmod = 0777 chown= root:root [supervisorctl] serverurl = unix:///run/supervisor.sock [supervisord] logfile=/var/log/supervisor/supervisord.log logfile_maxbytes=50MB logfile_backups=10 loglevel=info pidfile=/var/run/supervisord.pid nodaemon=true minfds=1024 minprocs=200 user=root ehildlogdir=/var/log/supervisor/ [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface ; Goアプリの設定 [program: sample] command=sample-go-app autostart=true autorestart=true user=sample-user startsecs=5 redirect_stderr=true stdout_logfile=/var/log/sample-go-app.log
[program:]
アプリをデーモン化する際はこのprogramセクションを使用します。
command
ここで設定したコマンドが起動時に実行されるようになります。
Goはビルドするとそれ自体で実行可能なバイナリになるのでここではバイナリを指定します。
autostart
Supervisor起動時に自動的にprogramセクションが起動するように設定できます。
autorestart
プロセスが死んだ時にSupervisorが自動的に再びプロセスを立ち上げるように設定できます。
user
programセクションを実行するユーザーを指定することができます。
redirect_stderr
エラー出力を標準出力にリダイレクトできます。
stdout_logfile
標準出力のログをファイルを指定することで保存できます。
Supervisorを起動してみる
設定を追加し終わったら次は実際に起動してみましょう。
supervisord
を叩くと起動することができます。
もし、本当に起動しているのか確認したい場合は supervisorctl
を叩くと確認することができます。
Supervisor自身の自動起動設定
最後にSupervisor自身を自動起動できるようにしましょう。
ありがたいことに起動時のスクリプトを書いてくれている方がいたのでこれをcloneしてきてコピーしましょう
git clone git://github.com/Supervisor/initscripts.git cd initscripts/ cp redhat-init-jkoppe /etc/init.d/supervisord cp redhat-sysconfig-jkoppe /etc/sysconfig/supervisord chkconfig --add supervisord chkconfig supervisord on