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

github.com