รัน go app แบบ background ด้วย supervisor บน Ubuntu 16.04

ในการนำ go มาใช้เป็น REST API หรือ Web Server เวลา Production จำเป็นต้องรันในลักษณะ background process ซึ่งถ้าเริ่มต้นก็อาจจะใช้ nohup รันขึ้นมา ซึ่งจะเป็น command ทำให้การจัดการยุ่งยาก และไม่มี logrotate

แต่อีกทางเลือกคือใช้ supervisor มารันเป็น service ครอบ process ของ go application และจัดการเรื่อง logrotate ให้เลย

Supervisor

Supervisor คือ procress control system สำหรับควบคุม process และ จัดการ log โดยลดความยุ่งยากจากเรียก command ปรกติ หรือการใช้ nohup (เวลา restart ก็ไม่ต้อง kill PID ด้วย) เราเลยเลือกใช้ supervisor มาควบคุม go application ของเราแทน โดยขั้นตอนไม่ยุ่งยาก

Install Supervisor บน Ubuntu 16.04

sudo apt-get install supervisor

สร้าง supervisor group

sudo addgroup --system supervisor
sudo adduser <goappuser> supervisor

Edit supervisor config

เพิ่ม config ของ supervisor ให้ group สามารถ read/write ได้

[unix_http_server]
file=/var/run/supervisor.sock  
chmod=0770 # chmod เปลี่ยนเป็น 0770 จาก 0700
chown=root:supervisor # chown ให้ group เป็น owner

[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisor

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[include]
files = /etc/supervisor/conf.d/\*.conf

Restart and check

sudo service supervisor restart
sudo tail /var/log/supervisor/supervisord.log # check log ว่าสามารถทำงานได้

สร้าง config สำหรับ go application

ทำการสร้างไฟล์ที่ /etc/supervisor/conf.d/goapp.conf

sudo vi /etc/supervisor/conf.d/goapp.conf

ใส่ config ตามตัวอย่าง

[program:goapp]
command=/home/<goappuser>/goapp # ที่อยู่ของ exec ไฟล์
autostart=true
autorestart=true
startretries=10
user=<goappuser> # user ที่รัน application
directory=/home/<goappuser>goapp # รัน applcation จาก directory
environment=APP_DB="mysql" # environmental variables
redirect_stderr=true
stdout_logfile=/var/log/supervisor/goapp.log # ที่อยู่ของ log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10

Test!

ลองทดสอบด้วยการ reload และ status

sudo service supervisor reload
sudo service supervisor status goapp

สามารถเช็คการทำงานได้ที่ log /var/log/supervisor/supervisord.log

เท่านี้ก็สามารถจัดการ background process ได้ง่ายๆแล้ว supervisor สามารถประยุกต์ไปใช้ได้อีกเยอะ ไม่ใช่เฉพาะแต่ golang เท่านั้น ลองใ้ช้งานกันดูครับ :)