使用Supervisor和Gunicorn部署Flask应用入门

前言

最简单的Flask Web应用:

新建文件夹myproject,里面就一个文件:myapp.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hi! It works!'

if __name__=='__main__':
    app.run(host='0.0.0.0')

想启动该应用,只要运行python myapp.py就可以在浏览器http://localhost:5000看到运行结果了。开心!

然鹅,这里的问题是:这个应用是单进程单线程的,如果在多个用户(高并发)的场景,这个就要跪了。

Gunicorn

这时候Gunicorn登场了,它就是来解决这个高并发的问题的。它全名叫Green Unicorn,是一个被广泛使用的高性能的Python WSGI Unix HTTP服务器。

安装

$ pip install gunicorn

使用

在命令行下,键入:

$ gunicorn -w 4 myapp:app

可以看到输出:

[2018-10-25 20:21:12 +0800] [28597] [INFO] Starting gunicorn 19.9.0
[2018-10-25 20:21:12 +0800] [28597] [INFO] Listening at: http://127.0.0.1:8000 (28597)
[2018-10-25 20:21:12 +0800] [28597] [INFO] Using worker: sync
[2018-10-25 20:21:12 +0800] [28600] [INFO] Booting worker with pid: 28600
[2018-10-25 20:21:12 +0800] [28601] [INFO] Booting worker with pid: 28601
[2018-10-25 20:21:12 +0800] [28602] [INFO] Booting worker with pid: 28602
[2018-10-25 20:21:12 +0800] [28603] [INFO] Booting worker with pid: 28603

在浏览器键入http://localhost:8000就可以访问。
其中-w表示启动的进程数,myapp是Python文件名,app是文件中的变量名或者函数名。可以看到,默认是绑定8000端口的,也就是说Python文件里那个main函数可以忽略了。

多进程高并发的问题解决了,开心!

然鹅,使用这个命令时,当我们退出终端时,这个应用就跪了,不能继续在后台运行,当然我们可以用nohup gunicorn -w 4 myapp:app &这个命令让它在后台运行,但是后续的状态监控呀什么的,可能就要用什么pskill这种原生态命令了,这真是太TM烦了。

Supervisor

这时候Supervisor闪亮登场!

Supervisor是一个进程管理系统,它通过fork/exec的方式将这些被管理的进程当作它的子进程来启动,若该子进程异常中断,则父进程可以准确地获取子进程异常中断的信息。

安装

$ sudo apt install supervisor

使用

在项目文件夹下新建supervisor_app.conf文件:

[include]
files=/etc/supervisord.conf

[program:awesome_app]
directory=/home/gld/myproject
command=gunicorn -w 4 myapp:app

启动supervisord:

sudo supervisord -c myproject/supervisor_app.conf

启动我们的应用:

$ sudo supervisorctl start awesome_app

常用管理命令:

$sudo supervisorctl start [program_name]
$sudo supervisorctl stop [program_name]
$sudo supervisorctl restart [program_name] # 重启服务,注意这里不会重新加载配置文件

重新加载配置文件,重新启动正在运行的服务:

$sudo supervisorctl reload

重新加载修改过的配置并重启该服务:

$sudo supervisorctl reread
$sudo supervisorctl update

进阶

Gunicorn

常用参数:
-w:进程数,如-w 4
-b:绑定地址和端口,如-b 0.0.0.0:5000

Supervisor

Supervisor只能监控前台程序, 如果你的程序是通过fork方式实现的daemon服务,则不能用它监控,否则会提示:BACKOFF Exited too quickly (process log may have details)。 因此像Apache、Tomcat服务默认启动都是按daemon方式启动的,则不能通过Supervisor直接运行启动脚本(service httpd start),相反要通过一个包装过的启停脚本来完成。(参考)

日志

  1. Logging, Flask, and Gunicorn … the Manageable Way

常见问题

CentOS 7.4默认的日志打印在/var/log/supervisor/supervisord.log文件下。

Permission权限问题
有时候提示往/tmp文件夹写入文件提示PermissionErr,检查supervisor配置文件,可以设置为user=root。

exit status 127; not expected
127表示命令没找到,首先可能是directory写错,用cd命令看一下,然后可能是command命令写错,复制命令在控制台试试是否gunicorn无法使用。

supervisor: couldn’t exec celery: EACCES

CentOS

CentOS Linux release 7.6.1810

安装Python3:
yum install python36u

安装pip3:
yum install python36u-pip

安装gunicorn:
pip3 install gunicorn

安装supervisor:
yum install supervisor

你可能感兴趣的:(使用Supervisor和Gunicorn部署Flask应用入门)