部署Flask应用

2055 字
6 分钟

每日一言

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框架的官方文档中还专门提到:开发服务器不安全、不稳定且性能低下

常见的生产式部署

客户端 → Nginx → WSGI服务器(Gunicorn/uWSGI) → Python应用

先从低层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服务器:

pip install gunicorn

然后我们可以通过一条简单的指令就能通过Gunicorn服务启动flask应用

gunicorn -w 4 -b 0.0.0.0:8000 app:app

Waitress服务器

Waitress 是一个纯python实现的WSGI服务器,完全支持Windows操作系统。

简单的用waitress服务启动flask服务

waitress-serve --port=8000 app:app
  • 第一个app的含义:flask应用的文件名,如app.py
  • 第二个app的含义:flask应用的变量名,如 app = Flask(__name__)

如果想要更加详细的配置waitress服务器,可以在要启动服务程序中如下配置:app.py

if __name__ == '__main__':
    #app.run(debug=True)
    from waitress import serve
    serve(
    app,
    host='0.0.0.0',
    port=8000,
    threads=8,                 # 线程池中的线程数
    connection_limit=1000,     # 最大并发连接数
    channel_timeout=10,       # 连接超时时间(秒)
    max_request_header_size=16384,  # 请求头大小限制
    max_request_body_size=1073741824,  # 请求体最大大小(1GB)
    url_scheme='http'
)

将原本的 app.run()替换为waitress服务器的内容

Web服务器---Nginx

配置WSGI我们已经解决了提高服务稳定性以及无法处理并发请求的问题,如果你的应用访问量相对较小,且静态资源较少,那么可以选择不用配置Nginx。配置Nginx的好处有:

  • 加快静态资源的处理速度
  • 提供安全的HTTPS连接
  • 将流量均分到多个后端服务器

详细需求可以参考下表:

场景推荐配置
开发环境仅 WSGI 足够
小型个人项目仅 WSGI 可接受
有静态资源的应用Nginx + WSGI 推荐
需要 HTTPS 的应用Nginx + WSGI 强烈推荐
任何生产环境Nginx + WSGI 几乎必须
高流量网站Nginx + 多实例 WSGI 必须

Nginx部署

Nginx最基本的配置如下:

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:8000;	//WSGI服务器运行的地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Nginx的配置相对复杂,需要学到时另开新篇写。