利用supervisor在linux上部署goweb項目

最近在鼓搗golang守護進程的實現,無心發現了supervisor這個有意思的東西。supervisor是一個unix的系統進程管理軟件,能夠用它來管理apache、nginx等服務,若服務掛了可讓它們自動重啓。固然也能夠用來實現golang的守護進程,下面描述下具體實現。 python

安裝supervisor

基於centos 6.4。 nginx

supervisor使用python編寫的,能夠用easy_install安裝。centos上默認有python的運行環境,安裝起來就很是簡單了。 golang

$ sudo yum install python-setuptools
$ sudo easy_install supervisor

若是沒有看到什麼報錯,那麼就安裝成功了,可使用echo_supervisord_conf查看配置詳情,然後生成配置文件。 apache

$ sudo echo_supervisord_conf > /etc/supervisord.conf

golang http服務

先整一個簡單的golang http服務 centos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
packagemain
 
import(
    "fmt"
    "log"
    "net/http"
)
 
funcmain() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello world")
    })
 
    err := http.ListenAndServe(":9090", nil)
    iferr != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

直接運行這個程序會佔用住終端,下面看看如何用supervisor來跑這個程序。 ui

supervisor配置golang

編輯/etc/supervisord.conf,在最後增長運行程序設置 spa

[program:golang-http-server]
command=/home/golang/simple_http_server
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/simple_http_server.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/simple_http_server.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

幾個配置說明: unix

command:表示運行的命令,填入完整的路徑便可。
autostart:表示是否跟隨supervisor一塊兒啓動。
autorestart:若是該程序掛了,是否從新啓動。
stdout_logfile:終端標準輸出重定向文件。
stderr_logfile:終端錯誤輸出重定向文件。 rest

其他配置說明能夠查看官方文檔。 日誌

啓動supervisor

$ sudo /usr/bin/supervisord -c /etc/supervisord.conf

若是出現什麼問題,能夠查看日誌進行分析,日誌文件路徑/tmp/supervisord.log

tips:

    1.若是修改了配置文件,能夠用kill -HUP從新加載配置文件

$ cat /tmp/supervisord.pid | xargs sudo kill -HUP

     2.如何運行失敗多是因爲文件沒有執行權限,則須要賦予文件執行權限

chmod 777 filename



查看supervisor運行狀態

$ supervisorctl
golang-http-server RUNNING pid 23307, uptime 0:02:55
supervisor>

輸入help能夠查看幫助

supervisor> help
default commands (type help ):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version

supervisor運行原理

supervisor運行後自己是守護進程,經過自身來管理相應的子進程,經過觀察相應的進程狀態就很明瞭了。

$ ps -ef | grep supervisord
root 23306 1 0 07:30 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root 23331 23222 0 07:41 pts/0 00:00:00 grep supervisord

$ ps -ef | grep simple_http_server
root 23307 23306 0 07:30 ? 00:00:00 /home/golang/simple_http_server
root 23333 23222 0 07:41 pts/0 00:00:00 grep simple_http_server

能夠很直觀的看出golang simple_http_server進程是supervisord的子進程。

相關文章
相關標籤/搜索