🐁

GoをSupervisorでデーモン化する

2021/09/14に公開

自分用の雑メモ。
今回はAWS(EC2)でデーモン化するまでやります。

yumを最新にアップデート。

$ sudo yum update

goを入れる。

$ amazon-linux-extras install golang1.11

$ export GOPATH="$HOME/go"
$ export PATH=$PATH:$GOPATH/bin

$ go version
go version go1.15.14 linux/amd64

python3とsupervisorを入れる。

$ sudo yum install python3
$ python3 --version
Python 3.7.10

$ sudo pip3 install supervisor
$ supervisord --version
4.2.2

sampleを元に、supervisord.confを作成する

$ echo_supervisord_conf > ~/supervisord.conf

$ sudo mkdir /etc/supervisord/
$ sudo mkdir /etc/supervisord/conf.d

$ sudo mv ~/supervisord.conf /etc/supervisord/supervisord.conf

一応オリジナルをとっておく

$ sudo cp /etc/supervisord/supervisord.conf /etc/supervisord/supervisord.conf.org

confを編集する(サンプルからの変更点のみ記載)

[inet_http_server]
port=127.0.0.1:9001
username=user
password=123

[supervisorctl]
;serverurl=unix:///tmp/supervisor.sock
serverurl=http://127.0.0.1:9001

[include]
files = /etc/supervisord/conf.d/*.conf

serviceファイルを作る

$ sudo touch /etc/systemd/system/supervisord.service
[Unit]
Description=supervisord - Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/supervisord -c /etc/supervisord/supervisord.conf
ExecReload=/usr/local/bin/supervisorctl reload
ExecStop=/usr/local/bin/supervisorctl shutdown
User=root

[Install]
WantedBy=multi-user.target

supervisorを起動&チェック

$ sudo systemctl start supervisord
$ sudo systemctl status supervisord
$ sudo systemctl enable supervisord

テスト用にgoプロジェクトを用意する。
今回は5秒に1回ログを出す。

package main

import (
  "log"
  "time"
)

func init()  {
  log.SetPrefix("[MAIN]")
}

func main()  {
  for {
    log.Println("Hello")
    time.Sleep(5 * time.Second)
  }
}

ビルドしておく。

$ go build hello.go

conf.dにファイルを追加する

$ sudo touch /etc/supervisord/conf.d/hello.conf
[program:hello]
command=/home/ec2-user/hello.sh
process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true
user=ec2-user
numprocs=1
redirect_stderr=true
stdout_logfile=/tmp/hello.log

再起動

$ sudo systemctl restart supervisord

ログを確認する

$ tail -f /tmp/hello.log

おまけ:WebUIを表示する(途中)

nginxを入れる

$ sudo amazon-linux-extras install nginx1
$ sudo systemctl start nginx
$ sudo systemctl enable nginx

nginx.confに設定を追加

server {
  
  location / supervisord/ {
    proxy_pass http://127.0.0.1:9001/;
    proxy_http_version 1.1;
    proxy_buffering     off;
    proxy_max_temp_file_size 0;
    proxy_redirect     default;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_set_header   Connection       "";
  }
  
}

単一ページは表示されるようにはなったけど、機能が動作しなかったり表示崩れがあったりする..

Discussion