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