• 安装Supervisor到CentOS(YUM)


    Supervisor是一个Linux下进程管理工具。 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为守护进程,并监控进程状态,异常退出时能自动重启,可以实现程序的自我恢复。

    运行环境

    系统版本: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转义码"
    ",多行日志.
    

    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
    
  • 相关阅读:
    第三百九十一、二、三、四、五、六、七天 how can I 坚持
    第三百九十天 how can I 坚持
    第三百八十九天 how can I 坚持
    POJ 1745:Divisibility 枚举某一状态的DP
    POJ 1502:MPI Maelstrom Dijkstra模板题
    POJ 1160:Post Office 邮局经典DP
    POJ 1062:昂贵的聘礼
    POJ 1125:Stockbroker Grapevine
    POJ 1236:Network of Schools
    POJ 2186:Popular Cows Tarjan模板题
  • 原文地址:https://www.cnblogs.com/network-ren/p/13132204.html
Copyright © 2020-2023  润新知