[参考资料]
http://www.imooc.com/wenda/detail/429467
http://f.dataguru.cn/forum.php?mod=viewthread&tid=917274&ordertype=1
Flask为什么需要部署
在开发调试过程中,我们往往会简单的使用flask自带的web服务器。但是在实际的生产环境中,flask自带的web服务器很难满足需求。
Flask ,Django 自带的web server的目的就是用于开发,而不是生产环境。他们俩本身是web framework而不是web server,他们自带的server应该都只能开单进程。而像gunicorn是prefork模式,从nginx每发过来一个请求,它就fork一个进程去处理这个请求,并buffer相关的数据。wsgi服务器都是专门为生产环境开发的,能配置更多从而处理更复杂的请求状况,从性能和稳定性来说,都更好。
Flask部署方式
WSGI
WSGI(server gateway interface),python web服务器网关接口。它是python语言定义的web服务器和web应用程序之间的一种简单通用的接口。WSGI可以分为两个部分:一个是服务器或者说是网关,另一个可以成为web应用或者说是应用框架。在处理来自前端的请求是,服务器会为应用程序提供环境上下文及一个回调函数。在应用程序完成请求之后,将先前的回调函数结果返回给前端。因此,对于flask而言,这里的WSGI可以起到的功能:
1.重写环境变量,根据目标url将请求消息路由到对应的应用对象;
2.允许在一个进程中运行多个web应用程序或者框架;
3.可以起到负载均衡远端请求的作用;
4.对请求或者返回内容进行处理。
因此,只要遵照WSGI协议的web应用都可以部署在对应的webserver之后。或者说WSGI之于python,就如同Fastcgi之于php。
独立的WSGI容器
如果同时有好几个东西在面前,能够实现的功能类似,我肯定会选择更容易操作的。在flask部署这件事情上,我会选择一些独立的WSGI容器来部署flask。
gunicorn
gunicorn是一个unix用的WSGI HTTP服务器。它是从ruby的unicorn项目中移植过来的。它基于”pre-fork worker”模型,会预先开启大量进程,等待并处理接收到的请求,每个单独进程可以同时处理它们各自接到的请求,避免进程启动和销毁的开销。但是gunicorn是基于阻塞式的io,并发能力稍弱。如果要想用它来部署flask应用相当简便。
Tornado
Tornado,它是一款开源的可伸缩、非阻塞式的web服务器和工具集。在高并发的应用场景中有不错的效果。同样,要想通过Tornado来部署flask也是很简便的。
Gevent
Gevent是一个基于协同程序的python库,与tornado的部署方式类似,通过gevent部署flask也是十分的便利。(猴子补丁)
nginx http代理
单纯依靠上述的这些wsgi容器在生产环境中还是不够的,往往还要在这些容器前边在部署一个nginx做http转发。nginx可以起到负载均衡、流量控制、日志管理等等更加精细的工作。对nginx的配置文件做简单的修改即可完成。
其他部署方式
当然,除了通过上述几个wsgi容器来简单的部署flask以外,还有其他几种方式也可以选择:mod_wsgi、uwsgi、fastcgi、cgi。
进程管理工具supervisor
最近在找flask生产环境部署相关的内容,无意间碰到一个神器:supervisord。
它是一个使用python编写的进程管理工具,可以很方便的开启、关闭或者重启进程。当你的主机不小心挂掉的时候,通过配制好的supervisord可以很方便的重启服务而不用一行一行敲命令。要想使用supervisord,只需要这几步:
- 第一步,当然还是安装:sudo pip install supervisor
- 安装完成之后,主要的任务就是要完成配置文件:echo_supervisord_conf > /path/to/supervisord.conf,先将supervisord的相关配置导出到指定路径以供修改;
- 下面主要修改我们比较关注的部分。