部署Flask应用
每日一言
Love for the dead is pointless. We fight to keep them alive, that is all. – Olivier Mira Armstrong
from Fullmetal Alchemist
为什么不直接使用flask框架?
在开发过程中测试Flask应用时,我们都是直接运行Falsk框架,然后访问flask监听的端口,就能简单直接的使用服务。那么我们为什么还要额外部署这些服务呢?
如果你的程序仅仅只有你一个人访问,并且启用服务时间很短,甚至仅仅只有偶尔你使用的时候才会启动服务。那么你完全不部署几乎没有任何问题。因为对于python web开发的常见部署,都是为了
- 增强程序运行稳定性
- 提高程序运行速度
- 增大程序并发处理能力
- 抵御网络攻击
类似这种问题而进行的。所以根据以上几点,我们也可以清楚的知道不进行服务部署的缺点:
- 程序稳定性差
- 单线程运行,无法处理并发请求
- 无安全防护能力
- 资源利用效率低
何况Flask框架的官方文档中还专门提到:开发服务器不安全、不稳定且性能低下
常见的生产式部署
1 |
|
先从低层WSGI服务器开始理解:
WSGI服务器
WSGI (Web Server Gateway Interface) 是 Python 编程语言中定义的一种标准接口,用于 Web 服务器和 Python Web 应用程序之间的通信。
简而言之,WSGI服务其实是用于python应用程序和Nginx(Web服务器)中间的一个过度层,将Web服务器发出的请求转化为python应用程序能够听懂的请求。
同时WSGI服务通常还能够较好的处理并发请求的问题。
常见的WSGI服务:
- Gunicorn:轻量级、高性能的WSGI服务器
- uWSGI:功能全面的应用服务器,支持多种协议
- Waitress:纯python实现,跨平台的WSGI服务器
使用Gunicorn部署Flask应用
首先强调一点:Gunicorn不支持Windows系统
首先我们需要安装Gunicorn服务器:
1 |
|
然后我们可以通过一条简单的指令就能通过Gunicorn服务启动flask应用
1 |
|
Waitress服务器
Waitress 是一个纯python实现的WSGI服务器,完全支持Windows操作系统。
简单的用waitress服务启动flask服务
1 |
|
- 第一个app的含义:flask应用的文件名,如app.py
- 第二个app的含义:flask应用的变量名,如
app = Flask(__name__)
如果想要更加详细的配置waitress服务器,可以在要启动服务程序中如下配置:app.py
1 |
|
将原本的 app.run()
替换为waitress服务器的内容
Web服务器—Nginx
配置WSGI我们已经解决了提高服务稳定性以及无法处理并发请求的问题,如果你的应用访问量相对较小,且静态资源较少,那么可以选择不用配置Nginx。配置Nginx的好处有:
- 加快静态资源的处理速度
- 提供安全的HTTPS连接
- 将流量均分到多个后端服务器
详细需求可以参考下表:
场景 | 推荐配置 |
---|---|
开发环境 | 仅 WSGI 足够 |
小型个人项目 | 仅 WSGI 可接受 |
有静态资源的应用 | Nginx + WSGI 推荐 |
需要 HTTPS 的应用 | Nginx + WSGI 强烈推荐 |
任何生产环境 | Nginx + WSGI 几乎必须 |
高流量网站 | Nginx + 多实例 WSGI 必须 |
Nginx部署
Nginx最基本的配置如下:
1 |
|
Nginx的配置相对复杂,需要学到时另开新篇写。