Brc's blog
首页
前端
后端
运维
  • 工作笔记
  • 分类
  • 标签
  • 归档
关于

Brc

努力中
首页
前端
后端
运维
  • 工作笔记
  • 分类
  • 标签
  • 归档
关于
  • Linux基础

    • Bash shell
    • 文件属性
    • 编辑工具vim
    • 用户管理
    • 用户组管理
    • 普通用户提权
    • 基础权限
    • 特殊权限
    • 文件特殊属性
    • IO重定向
    • 文件查找
    • 文件压缩
    • 软件包管理

    • 磁盘管理

    • 进程管理
    • 计划任务
    • systemd
    • Supervisor
      • Supervisor基本概述
        • 什么是supervisor
        • 为什么要使用supervisor
        • Supervisor基础组件
      • Supervisor安装配置
        • Supervisor安装
        • Supervisor配置
      • Supervisor管理后台程序
        • Supervisor管理fastapi项目
        • Supervisor管理Java
      • Supervisor Web页面
    • 网络管理

    • Chrony时间同步
    • NFS网络文件系统
  • Linux进阶

  • 其他

  • 运维
  • Linux基础
Brc
2021-07-29
目录

Supervisor

# Supervisor基本概述

# 什么是supervisor

supervisor是一个进程管理服务,主要用来将运行在前台的进程转为后台运行,并实时监控进程的状态,当出现异常时会自动将该进程拉起。

# 为什么要使用supervisor

其实在我们维护的Linux服务中,有不少程序没有启停脚本,并且还是前台运行,比如Python程序。当然熟悉Linux的朋友会考虑使用&符号、或screen,将其转为后台进程。但这些方式仅仅只是将进程放置后台,当我们想要重启服务时,需要先kill进程、然后在挂后台,比较复杂。而Supervisor则不同,它能实现:

  1. 将前台运行进程转为后台进程;
  2. 监控进程运行情况,如果进程异常退出,会自动重新启动进程;
  3. 能对服务进行启动、重启、关闭等便捷的操作;
  4. 提供web界面,便于开发人员使用;

# Supervisor基础组件

  • supervisord

    • 主进程,负责管理进程的服务,对crash的进程重启,对进程变化发送事件通知等。
  • supervisorctl

    • 命令行管理工具,可以利用它来查看被管理的进程状态,启动停止/重启进程,获取running子进程的列表等;
    • supervisorctl不仅可以连接到本机上的supervisord,还可以连接到远程的supervisord,当然在本机上面是通过UNIX socket连接的,远程是通过TCP socket连接的;
    • supervisorctl和supervisord之间的通信,是通过xml_rpc完成的;
  • Web Server

    • supervisor提供了web server功能,可通过web控制进程(需要设置[inet_http_server]配置项)。
  • XML-RPC Interface

    • 远程调用服务,通过HTTP协议提供的Web服务,用来控制supervisor以及supervisor运行的进程。

# Supervisor安装配置

# Supervisor安装

[root@web ~]# yum install supervisor -y
[root@web ~]# systemctl enable supervisord
[root@web ~]# systemctl start supervisord
1
2
3

# Supervisor配置

  1. Supervisor配置文件[unix_http_server]

    [unix_http_server]
    file=/var/run/supervisor/supervisor.sock	;# supervisorctll与supervisor通讯方式
    ;chmod=0780					; # socket文件的权限,默认0700
    ;chown=nobody:nogroup		; # socket文件的属主与属组
    ;username=user				; # 使用supervisorctl连接时,认证的用户(非必选)
    ;password=123				; # 使用supervisorctl连接时,认证的密码(非必选)
    
    1
    2
    3
    4
    5
    6
  2. Supervisor配置文件[inet_http_server]

    ;[inet_http_server]			; # 监听在TCP协议,webServer需要使用,远程连接也需要使用
    ;port=127.0.0.1:9001		; # 访问webServer时使用的地址、端口
    ;username=user				; # 访问webServer的用户名称
    ;password=123				; # 访问webServer的用户名称
    
    1
    2
    3
    4
  3. Supervisor配置文件[supervisord]

    [supervisord]			; # 这个主要是定义supervisord这个服务端进程的一些参数的
    logfile=/var/log/supervisor/supervisord.log	; # supervisord进程日志
    logfile_maxbytes=50MB	; # 默认日志存储50m,会进行自动切割
    logfile_backups=10		; # 日志文件数量,程序启动会创建10个backup文件,用于log rotate
    loglevel=info			; # 日志级别,默认info,(debug,warn,trace)
    pidfile=/var/run/supervisord.pid	; # supervisord pid文件
    nodaemon=false			; # 默认守护进程运行,true则supervisord前台运行
    minfds=1024				; # 系统最少空闲的文件描述符,低于这个值supervisor将不会启动
    minprocs=200			; # 进程最小可用文件描述符,低于这个值supervisor将不会正常启动
    ;umask=022				; # 进程创建文件的掩码,默认umask 022
    ;user=chrism			; # 设置一个普通用户,后期可以通过该普通用户对supervisord进行管理
    ;identifier=supervisor	; # supervisord的标识,如果有多个则需要设置不同的标识
    ;directory=/tmp			; # 启动supervisord进程之前,会切换到该目录(可不配置)
    ;nocleanup=true			; # false会在进程启动时,将以前子进程产生的日志文件(路径为AUTO)清除掉。
    ;childlogdir=/tmp		; # 当子进程日志路径为AUTO时,子进程日志文件存储至/tmp
    ;environment=KEY=value	; # 设定环境变量,子配置文件会继承主进程定义的环境变量
    ;strip_ansi=false		; # true会清除子进程日志中的所有ANSI序列。也就是日志中的\n,\t默认为false
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
  4. Supervisor配置文件[supervisorctl]

    [supervisorctl]						; # 这个主要是supervisorctl的一些配置
    serverurl-unix:///var/run/supervisor/supervisor.sock; # 本地UNIX socket路径,注意和前面对应
    ;serverurl=http://127.0.0.1:9001	; # supervisorctl的WebServer连接地址
    ;username=chris						; # WebServer设定的用户名称
    ;password=123						; # WebServer设定的密码
    ;prompt=mysupervisor				; # 输入用户名密码时候的提示符,默认supervisor
    ;history_file=~/.sc_history			; # 历史记录,通过该文件查找历史记录
    
    1
    2
    3
    4
    5
    6
    7
  5. Supervisor配置文件[program]

    ;[program:theprogramname]		; # program是要被管理的进程,填写相应进程名称即可
    ;command=/bin/cat				; # 启动进程的命令路径,可以携带参数
    ;process_name=%(program_name)s	; # 进程名称,默认获取program设定的名称
    ;numprocs=1						; # 启动进程的数量
    ;directory=/tmp					; # 运行进程会切换到该目录
    ;umask=022						; # 进程掩码,默认None
    ;priority=999					; # 子进程启动和关闭的优先级,优先级低先启动,关闭时最后关闭
    ;autostart=true					; # 启动supervisord后启动被管理的子进程
    ;autorestart=true				; # 当子进程挂掉后会自动重启
    ;startsecs=10					; # 子进程启动后多少秒,则认为成功启动
    ;startretries=3					; # 子进程启动失败,最大尝试启动的次数
    ;exitcodes=0,2					; # 定义退出的状态码、0或2
    ;stopsignal=QUIT				; # 进程停止信号、默认TERM
    ;stopwaitsecs=10				; # 向子进程发送stopsignal信号,如果超过等待时间,则强制kill子进程。
    ;user=chrism					; # 设置非root用户管理该program
    ;redirect_stderr=true			; # 如果为true,则stderr的日志会被写入stdout日志文件中默认为false
    ;stdout_logfile=/a/path			; # 子进程的stdout的日志路径,可以指定路径,AUTO,none等三个选项。
    ;stdout_logfile_maxbytes=1MB	; # 日志文件最大大小,默认为50M
    ;stdout_logfile_backups=10		; #
    ;stdout_capture_maxbytes=1MB	; #
    ;stdout_events_enabled=false	; #
    ;stderr_logfile=/a/path			; # 这个东西是设置stderr写的日志路径
    ;stderr_logfile_maxbytes=1MB	; # 错误日志文件最大大小,默认为50M
    ;stderr_logfile_backups=10		; # 错误日志文件数量
    ;stderr_capture_maxbytes=1MB	; #
    ;environment=A=1,B=2			; # 该子进程的环境变量,和别的子进程不进行共享
    ;serverurl=AUTO					; # override serverurl computation(childutils)
    ;stopasgroup=true				; # 默认为false,配合killasgroup使用
    ;killasgroup=true				; # 父进程在接收到stop信号后,会把该信号传递给子进程,以免产生孤儿进程
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
  6. Supervisor配置文件[group],[include]

    ;[group:thegroupname]			; # 为programs分组,方便进行统一操作
    ;programs=progname1,progname2	; # 组的成员进程,用逗号分开
    ;priority=999					; # 优先级
    
    [include]
    files = supervisord.d/*.ini		; # 包含supervisord.d目录下的所有.ini文件
    
    1
    2
    3
    4
    5
    6

# Supervisor管理后台程序

# Supervisor管理fastapi项目

  1. 安装python并准备fastapi项目

    [root@web data]# yum install python3 -y
    [root@web data]# git clone https://gitee.com/birenchong/fastapi_api.git
    正克隆到 'fastapi_api'...
    
    1
    2
    3
  2. 创建虚拟环境

    [root@web data]# cd fastapi_api/
    [root@web fastapi_api]# python3 -m venv fastapi_env
    
    1
    2
  3. 激活虚拟环境,安装pip包,手动运行测试服务是否正常

    # 激活虚拟环境
    [root@web fastapi_api]# . fastapi_env/bin/activate
    # 更新pip
    (fastapi_env) [root@web fastapi_api]# pip3 install --upgrade pip
    # 安装pip包
    (fastapi_env) [root@web fastapi_api]# pip3 install -r requirements.txt
    # 手动运行
    (fastapi_env) [root@web fastapi_api]# uvicorn app.main:app --host '0.0.0.0'
    
    1
    2
    3
    4
    5
    6
    7
    8
  4. 编写Supervisor管理fastapi的配置文件

    [root@web ~]# cat /etc/supervisord.d/fastapi.ini
    [fcgi-program:fastapi]
    socket=unix:///data/fastapi_api/fastapi_api.sock
    directory=/data/fastapi_api
    command=/data/fastapi_api/fastapi_env/bin/uvicorn --fd 0 app.main:app
    numprocs=4
    process_name=fastapi-%(process_num)d
    autostart=true
    autorestart=true
    stdout_logfile=/var/log/fastapi_stdout.log
    stderr_logfile=/var/log/fastapi_stderr.log
    user=root
    stopsignal=TERM
    startsecs=5
    startretries=3
    stopasgroup=true
    killasgroup=true
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
  5. 启动

    [root@web ~]# supervisorctl update		# 一定要先更新
    [root@web ~]# supervisorctl start fastapi:*
    [root@web ~]# supervisorctl stop fastapi:*
    [root@web ~]# supervisorctl restart fastapi:*
    [root@web ~]# supervisorctl status fastapi:*
    
    1
    2
    3
    4
    5
  6. 配置nginx反向代理

    server{
        listen 8000;
        location / {
            proxy_pass   http://unix:/data/fastapi_api/fastapi_api.sock;
        }
    }
    
    1
    2
    3
    4
    5
    6

# Supervisor管理Java

  1. 安装ava环境

    [root@web ~]# yum install java -y
    
    1
  2. 手动启动java项目测试

    [root@web ~]# java -jar dingding-sonar-1.0-SNAPSHOT.jar --server.port=8082
    
    1
  3. 编写Supervisor管理Java的ini配置文件,进行自动化管理

    [root@web ~]# cat /etc/supervisord.d/sonar_dingding.ini
    [program:sonar-dingding]
    directory=/opt
    command=/bin/bash -c "java -jar dingding-sonar-1.0-SNAPSHOT.jar --server.port=8082"
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/sonar_dingding_stderr.log
    stdout_logfile=/var/log/sonar_dingding_stdout.log
    user=root
    stopsignal=QUIT
    startsecs=10
    startretries=5
    stopasgroup=true
    killasgroup=true
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

# Supervisor Web页面

  1. 编辑supervisor主配置文件

    [inet_http_server]
    port=0.0.0.0:9001
    username=bi
    password=123
    
    1
    2
    3
    4
  2. 通过浏览器访问9001端口

image-20210730122735204

#Linux
Last Updated: 2021/11/25, 10:57:04
systemd
互联网通信协议

← systemd 互联网通信协议→

最近更新
01
谷歌云创建GKE集群
07-26
02
ElastiCacheForRedis启用密码
07-26
03
upload-to-gcs
06-29
更多文章>
Theme by Vdoing | Copyright © 2021-2024 Brc | MIT License | 浙ICP备19031881号-4
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式