使用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

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手撕机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值