Flask 从开发到部署

 

整理一下怎么开发flask程序应部署到生产环境中

 

1. 第一个flask 程序 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. 5000是flask默认端口. 我们的目标是产品化部署,这样未免太简单了,还有很多问题待解决. 1. 这个程序是同步的,如果一个API请求IO阻塞了,就不响应后续请求了,2. flask自带的web server是调试用的,不适合做产品server.  这就需要用gunicorn 来启动多进程来跑.

 

 2. Gunicorn 运行 flask 程序

我在win10 powershell 里运行的,pip install gunicorn 后运行 

gunicorn -w 4 myapp:app

报错了,查了下gunicorn 不支持在windows. 

 那再试下windows下的WSL2, ubuntu 下安装了pip3,Flask, gunicorn 后运行如下,可以看到flask 自带的server(5000端口)已经换成了gunicorn server了(8000端口)

TODO: gunicorn 有个参数 -k ,默认是sync, 如果要选gevent 需要改造flask应用程序吗? 还是直接就起作用了?

3. Supervisor 监控 gunicorn

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

4. 需要加Nginx吗?有没有必要?

5. 做一个docker image,把刚才的flask 放进docker 运行

 

Ref:

  1. 使用Supervisor和Gunicorn部署Flask应用入门
  2. https://blog.csdn.net/wenqiang1208/article/details/105520549 supervisor + gunicorn
  3. https://docs.docker.com/get-started/06_bind_mounts/
  4. https://blog.csdn.net/u012308586/article/details/102953882 换ubuntu 源
  5. https://blog.csdn.net/qq_35759574/article/details/82842637 换ubuntu源
  6. https://blog.csdn.net/weixin_39394526/article/details/87937645 遇到cannot import name 'sysconfig'问题看这个文章
  7. 使用Dockerfile构建supervisor容器部署项目,CMD ["supervisord","-c","/etc/supervisord.conf"]执行失败  遇到docker CMD 启动supervisor 就退出,需要加 -n 放在前台
  8. https://blog.csdn.net/h106140873/article/details/90752725 Docker 重启时保证container 重启用--restart=always, container恢复不重启用 =no
  9. https://blog.csdn.net/qq_27575627/article/details/73470120
  10. Flask+Gunicorn+Gevent+Supervisor+Nginx生产环境部署
转载请注明出处 http://www.cnblogs.com/mashuai-191/
原文地址:https://www.cnblogs.com/mashuai-191/p/14729699.html