Supervisor管理python web服务 / 网络研习社#88

in hive-180932 •  6 months ago 

supervisor.jpg

Supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

因为是python开发的一个库,可以直接用pip来安装,很方便。supervisor安装完成后会生成三个执行程序:supervisord、supervisorctl、echo_supervisord_conf,分别是supervisor的守护进程服务(用于接收进程管理命令)、客户端(用于和守护进程通信,发送管理进程的指令)、生成初始配置文件程序。

pip install supervisor  #supervisor-4.2.5

echo_supervisord_conf  #查看基本配置
echo_supervisord_conf > /home/wsgi.ini #生成初始配置文件

# 配置范例
[program:wsgiX]   ;program:名称
;工作目录(脚本启动目录的全路径)
directory=/home/knowqa 
;启动命令,当然你可以直接 python api.py,此处使用gunicorn启动
command = /home/knowqa/know_env/bin/python /home/knowqa/know_env/bin/gunicorn -c config.py api:app
startsecs=0
stopwaitsecs=0
autostart=true          ;supervisord守护程序启动时自动启动tornado
autorestart=true        ;supervisord守护程序重启时自动重启tornado
redirect_stderr=true   ;将stderr重定向到stdout
;日志标准输出路径,同时脚本print打印信息也会在改文件显示
stdout_logfile=./stdout.log
stderr_logfile=./error.log

;守护进程,可在 web 上访问
[inet_http_server]     ; inet (TCP) server disabled by default
port=0.0.0.0:9001    ; (ip_address:port specifier, *:port for all iface) 127.0.0.1
username=user          ; (default is no username (open server))
password=123           ; (default is no password (open server))

;supervisord日志配置
[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=1

# 启动
supervisord -c ./wsgi.ini
//supervisord -c /home/wsgi.ini

查看运行状态

ps -ef | grep supervisord
supervisor2.jpg

看到如上所示,即运行正常。如果要停止,则直接kill, 比如: kill 197320 。命令如下:
kill pid #停止运行

在Supervisor的使用中,其中“工作目录”和 “启动命令”是最关键的两处设置,务必正确! 在“启动命令”时可以看到是使用gunicorn来启动服务的,就来补下gunicorn的设置。

Gunicorn

Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server,和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点。

pip install gunicorn

# 快速启动run.py
gunicorn --workers=4 --bind=0.0.0.0:8000 run:app

# run.py
from flask import Flask
app = Flask(__name__)

# 配置文件启动
命令行中定义的参数,都可以放在配置文件中。
# 配置文件范例 config.py
import multiprocessing

bind = "0.0.0.0:8000"
workers = multiprocessing.cpu_count() * 2 + 1

backlog = 2048
worker_class = "eventlet"
worker_connections = 1000
daemon = True
pidfile = 'log/gunicorn.pid'
accesslog = 'log/access.log'
errorlog = 'log/gunicorn.log'

# 启动
gunicorn --config=config.py run:app

# 服务重启、退出等
获取Gunicorn进程树,用下面的命令获取gunicorn的Master PID
#方法1
pstree -ap|grep gunicorn
#方法2
ps -ef|grep gunicorn 
# 重启Gunicorn进程
HUP(终端断线)信号发出之后,worker进程会进行被杀掉,并启动新的进程,保证源代码的修改会反映进来。master进程不会变。
kill -HUP master_pid
# 优雅停止Gunicorn进程
pkill gunicorn
kill -9 master_pid
Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!