運行環境
系統版本:CentOS Linux release 7.6.1810 (Core)
軟件版本:Python
硬件要求:無
安裝過程
1、安裝Python
Supervisor是Python的一個模塊,所以我們需要先安裝Python。
[root@localhost ~]# yum -y install git gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel
[root@localhost ~]# git clone https://github.com/pyenv/pyenv.git ~/.pyenv
[root@localhost ~]# vim /etc/profile
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH=$HOME/.pyenv/bin:$PATH
eval "$(pyenv init -)"
[root@localhost ~]# source /etc/profile
[root@localhost ~]# pyenv -v
[root@localhost ~]# pyenv install --list
[root@localhost ~]# for i in $(grep -r 'www.python.org' ~/.pyenv/*|awk -F ':' '{print $1}'|grep '^/');do sed -i 's#https://www.python.org/ftp/#https://npm.taobao.org/mirrors/#g' $i;done
[root@localhost ~]# pyenv install 3.7.0
[root@localhost ~]# pyenv versions
* system (set by /root/.pyenv/version)
3.7.0
[root@localhost ~]# pyenv global 3.7.0
[root@localhost ~]# python
Python 3.6.9 (default, Apr 9 2020, 07:01:31)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
2、安裝Supervisor
[root@localhost ~]# pip install supervisor
3、創建Supervisor的配置文件
Supervisor提供命令"echo_supervisord_conf"輸出默認的模板配置信息,安裝完成后我們需要手動創建主配置文件。
[root@localhost ~]# echo_supervisord_conf > /etc/supervisord.conf
4、查看Supervisor版本
[root@localhost ~]# supervisord -v
4.2.0
使用Supervisor監管Nginx
使用Supervisor監管Nginx,當Nginx發生意外故障退出時,自動重啟Nginx服務,已實現自我恢復。
1、創建Supervisor主配置文件
創建Supervisor的主配置文件。
如果將Supervisor的主配置文件存放到其他位置的話,則對"Supervisor"的所有操作都需要使用"-c"選項指定主配置文件。
[root@localhost ~]# echo_supervisord_conf >/etc/supervisord.conf
2、創建相關目錄
創建用於Supervisor工作目錄,用於集中存放程序配置、日志等文件。
[root@localhost ~]# mkdir -p /usr/local/supervisor/conf
[root@localhost ~]# mkdir -p /usr/local/supervisor/logs/childlog
[root@localhost ~]# mkdir -p /usr/local/supervisor/logs/nginxlog
3、配置Supervisord
Supervisord是Supervisor的服務端,提供對程序的監管服務。
[root@localhost ~]# vim /etc/supervisord.conf
[supervisord]
logfile=/usr/local/supervisor/logs/supervisord.log ; 日志文件路徑.
logfile_maxbytes=50MB ; 日志最大大小.
logfile_backups=10 ; 日志保留數量.
loglevel=info ; 日志級別.
pidfile=/usr/local/supervisor/supervisord.pid ; 進程PID文件.
nodaemon=false ; 進程非前台運行.
silent=false ; 輸出Supervisord信息到日志而不是"stdout".
minfds=1024 ; 打開文件數量限制.
minprocs=200 ; 打開進程數量限制.
umask=022 ; 進程生成文件權限掩碼.
user=root ; 運行用戶.
identifier=supervisor ; 進程標識符,由RPC接口調用時使用.
directory=/usr/local/supervisor ; 工作主目錄.
nocleanup=true ; 緩存日志自動清理.
childlogdir=/usr/local/supervisor/logs/childlog ; 被監管程序所產生的日志輸出目錄.
;environment=KEY="value" ; 進程內部可以使用的環境變量.
;strip_ansi=false ; 禁止在日志中添加ANSI轉義碼"\r\n",多行日志.
4、配置HTTP Server
HTTP Server是Supervisor的管理端,提供對監管服務以及被監管程序的控制。管理員通過瀏覽器或者"supervisorctl"命令完成對Supervisor的管理控制。
啟用HTTP Server的方式有兩種:
"unix_http_server",開放一個UNIX域套接字,管理員可以通過這個套接字管理控制Supervisor。
"inet_http_server",開放一個TCP套接字,管理員可以通過IP地址:端口的方式管理控制Supervisor。
開啟其中一個即可。
[root@localhost ~]# vim /etc/supervisord.conf
;[unix_http_server]
;file=/tmp/supervisor.sock ; UNIX域套接字文件路徑.
[inet_http_server]
port=0.0.0.0:9001 ; 監聽地址和端口.
username=user ; 用戶名.
password=123 ; 密碼.
5、配置Supervisorctl
Supervisorctl是Supervisor提供的一條命令行管理客戶端,通過連接到HTTP Server,可以在命令行中使用命令"supervisorctl"實現對Supervisor的管理控制。
[root@localhost ~]# vim /etc/supervisord.conf
[supervisorctl]
;serverurl=unix:///tmp/supervisor.sock ; UNIX域套接字文件.
serverurl=http://127.0.0.1:9001 ; HTTP Server連接地址和端口.
username=user ; 連接所使用的用戶名.
password=123 ; 連接所使用的密碼.
prompt=mysupervisor ; 提示信息.
history_file=/usr/local/supervisor/.sc_history ; 命令歷史記錄文件.
6、獨立程序配置
使用"[include]"部分,可以將被監管的程序相關配置獨立到另外一個文件中,以便於管理。
[include]
files=/usr/local/supervisor/conf/*.conf ; 在設置目錄下檢索其他獨立配置文件.
7、添加一個程序
添加一個程序NGINX,NGINX將交由Supervisor監管。
注:由於NGINX程序交由Supervisor托管,則NGINX必須在前台運行。
[root@localhost ~]# vim /usr/local/supervisor/conf/nginx.conf
[program:nginx] ; 程序名.
command=/usr/sbin/nginx -g 'daemon off;' ; 啟動程序所使用的命令.
process_name=%(program_name)s_%(process_num)02d ; 程序進程名.
numprocs=1 ; 進程數量.
directory=/usr ; 工作目錄.
umask=022 ; 進程生成文件權限掩碼.
priority=999 ; 程序啟動優先級.
autostart=true ; 當"Supervisord"啟動時自動啟動該程序.
startsecs=1 ; 完成啟動等待時間.
startretries=3 ; 啟動程序重試次數.
autorestart=true ; 當程序因故障退出時自動重啟程序.
exitcodes=0 ; 程序退出狀態碼.
stopsignal=TERM ; 程序停止信號.
stopwaitsecs=10 ; 程序停止等待時間,超時則強制退出程序.
stopasgroup=true ; 停止程序進程組.
killasgroup=true ; 強制停止程序進程組.
user=root ; 程序運行用戶.
redirect_stderr=true ; 將"stderr"重定向到"stdout".
stdout_logfile=/usr/local/supervisor/logs/nginxlog/nginx_stdout.log ; "stdout"輸出到日志文件中.
stdout_logfile_maxbytes=50MB ; stdout日志文件最大大小.
stdout_logfile_backups=10 ; stdout日志文件保留數量.
;stdout_capture_maxbytes=0 ; 關閉stdout日志事件捕獲功能.
;stdout_events_enabled=false ; 關閉stdout日志事件功能.
;stdout_syslog=false ; 禁用將stdout輸出到syslog.
;stderr_logfile=/usr/local/supervisor/logs/nginxlog/nginx_stderr.log ; "stderr"輸出到日志文件中.
;stderr_logfile_maxbytes=50MB ; stderr日志文件最大大小.
;stderr_logfile_backups=10 ; stderr日志文件保留數量.
;stderr_capture_maxbytes=0 ; 關閉stderr日志事件捕獲功能.
;stderr_events_enabled=false ; 關閉stderr日志事件功能.
;stderr_syslog=false ; 禁用將stderr輸出到syslog.
;environment=A="1",B="2" ; 程序內部使用的環境變量.
;serverurl=AUTO ; HTTP Server連接地址.
8、啟動Supervisord服務
[root@localhost ~]# supervisord -c /etc/supervisord.conf
[root@localhost ~]# netstat -lnupt |grep 9001
tcp 0 0 0.0.0.0:9001 0.0.0.0:* LISTEN 16605/python3.7
[root@localhost ~]# tail -f /usr/local/supervisor/logs/supervisord.log
2020-06-11 08:38:52,474 INFO spawned: 'nginx_00' with pid 16606
2020-06-11 08:38:53,526 INFO success: nginx_00 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
9、查看程序運行狀態
[root@localhost ~]# supervisorctl status
nginx:nginx_00 RUNNING pid 16606, uptime 0:04:18
[root@localhost ~]# netstat -lnupt |grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 16606/nginx: master
tcp6 0 0 :::80 :::* LISTEN 16606/nginx: master
10、模擬程序故障
手動殺死Nginx進程,觀測Nginx服務運行狀態。
我們可以通過日志查看到Nginx自動重啟了一次,即被"Supervisor"監管的Nginx服務出現故障時,"Supervisor"會自動重啟Nginx服務,實現Nginx的自我恢復。
[root@localhost ~]# kill -15 16606
[root@localhost ~]# tail -f /usr/local/supervisor/logs/supervisord.log
2020-06-11 08:38:52,474 INFO spawned: 'nginx_00' with pid 16606
2020-06-11 08:38:53,526 INFO success: nginx_00 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2020-06-11 08:46:19,987 INFO exited: nginx_00 (exit status 0; expected)
2020-06-11 08:46:21,047 INFO spawned: 'nginx_00' with pid 16856
2020-06-11 08:46:22,076 INFO success: nginx_00 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
[root@localhost ~]# netstat -lnupt |grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 16856/nginx: master
tcp6 0 0 :::80 :::* LISTEN 16856/nginx: master
[root@localhost ~]# supervisorctl status
nginx:nginx_00 RUNNING pid 16856, uptime 0:02:54