supervisor使用

Supervisor 是一個 CS 模式系統,容許用戶在類 UNIX 系統上監測和管理必定數量的進程,還支持 Web 界面管理進程。它的目標與 launchd, daemontools 和runit 有些類似, 可是與它們不同的是, 它不是做爲 init (進程號pid是1)運行. 它是被用來控制進程, 而且它在啓動的時候和通常程序並沒有二致。
supervisord 還要求管理的程序是非 daemon 程序,supervisord 會幫你把它轉成 daemon 程序, Monit 和 Supervisord 的一個比較大的差別是 Supervisord 管理的進程必須由 Supervisord來啓動,Monit 能夠管理已經在運行的程序html

1、安裝 Supervisor

Supervisor 是由 python 編寫的,先安裝 python 和 pip (python 包管理工具)python

yum install epel* python python-pip -y

用 pip 安裝 supervisornginx

pip install supervisor

安裝後,會出現2個可執行文件:
/usr/bin/supervisord -- supervisor 服務守護進程
/usr/bin/supervisorctl -- supervisor 控制檯進程vim

生成默認配置文件bash

echo_supervisord_conf > /etc/supervisord.conf

2、配置 Supervisor

這裏以 Nginx 爲例介紹怎麼管理應用進程服務器

一、安裝 nginxsocket

yum -y install nginx      # 安裝 nginx

設置 nginx 不之後臺模式運行tcp

sed -i.bak '/worker_processes/a daemon off;' /etc/nginx/nginx.conf

二、設置 supervisord
主要經過修改其主配置文件實現工具

vim /etc/supervisord.conf
[inet_http_server]             ; 開啓TCP/IP http 服務器
port=192.168.18.10:9001        ; 偵聽端口
username=user                  ; 認證用戶名
password=123                   ; 密碼

[supervisord]
logfile=/tmp/supervisord.log    ; 日誌輸出文件
logfile_maxbytes=50MB           ; 日誌最大空間
logfile_backups=10              ; 日誌輪轉保留數
loglevel=info                   ; (日誌等級; default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid    ; (pid文件; default supervisord.pid)
nodaemon=false                  ; (前臺運行 ;default false)
minfds=1024                     ; (最小文件描述符數 ;default 1024)
minprocs=200                    ; (最小進程數  ;default 200)

[rpcinterface:supervisor]       ; rpc 接口
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]    ; 控制檯設置
erverurl=unix:///tmp/supervisor.sock    ; socket 訪問路徑
serverurl=http://192.168.18.10:9001     ; URL 訪問路徑
username=user                           ; 使用的認證用戶名 (上同)
password=123                            ; 密碼
prompt=mysupervisor                     ; cmd line prompt (default "supervisor")
history_file=~/.sc_history              ; use readline history if available


[program:nginx]
command=/usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf         ; 程序路徑
directory=/tmp                                        ; 切換到目錄
user=www-data                                         ; 執行程序的用戶
autorestart=true                                      ; 自動重啓
priority=999                                          ; 優先級
startsecs=1                                           ; 重啓前等待時間
startretries=100                                      ; 最大重啓次數 
stdout_logfile=/tmp/supervisor/nginx/nginx.log        ; 日誌文件
stdout_logfile_maxbytes=10MB                          ; 日誌文件最大容量
stderr_logfile=/tmp/supervisor/nginx/nginx_err.log    ; 錯誤日誌文件
stderr_logfile_maxbytes=1MB                           ; 錯誤日誌文件最大容量

建立日誌目錄,設置權限測試

mkdir -p /tmp/supervisor/nginx/
chown -R nginx:nginx /tmp/supervisor/nginx/

啓動 supervisord 的後臺進程:

supervisord -c /etc/supervisord.conf

加入開機啓動項

echo "supervisord -c /etc/supervisord.conf" >> /etc/rc.local

防火牆上放行 Web 端口

iptables -I INPUT -m state --state NEW -p tcp --dport 9001 -j ACCEPT
service iptables save

3、管理界面介紹

supervisorctl start nginx  # 啓動 nginx
supervisorctl start all    # 啓動全部進程
supervisorctl status       # 查看進程狀態

也可以使用交互模式管理進程:

supervisorctl
nginx                            RUNNING   pid 4883, uptime 0:02:03
mysupervisor>
mysupervisor> help
default commands (type help <topic>):
=====================================
add    clear  fg        open  quit    remove  restart   start   stop  update
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version

還可以使用 Web 管理界面
Web 管理界面
測試:

lsof -i:80 # 查看到此時的 PID 爲 1677
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1677  root    6u  IPv4  29067      0t0  TCP *:http (LISTEN)
nginx   1678 nginx    6u  IPv4  29067      0t0  TCP *:http (LISTEN)

[root@Srv-A meld3-1.0.2]# killall nginx #關閉全部 nginx 進程:
[root@Srv-A meld3-1.0.2]# lsof -i:80 # 此時,已經生成了新的 PID 1681

Debug:

生成配置文件時

supervisord -c /etc/supervisord.conf

出現:

Traceback (most recent call last):
  File "/usr/bin/echo_supervisord_conf", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg/pkg_resources.py", line 2603, in <module>
  File "/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg/pkg_resources.py", line 666, in require
  File "/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg/pkg_resources.py", line 565, in resolve
pkg_resources.DistributionNotFound: meld3>=0.6.5

解決方法:pip安裝的meld3不可用,手動安裝。

wget https://pypi.python.org/packages/source/m/meld3/meld3-1.0.2.tar.gz
tar -zxf meld3-1.0.2.tar.gz
cd meld3-1.0.2
python setup.py install

參考:
http://supervisord.org/
http://supervisord.org/installing.html

相關文章
相關標籤/搜索