部署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
2
客户端 → 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服务器:

1
pip install gunicorn

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

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

Waitress服务器

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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最基本的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
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的配置相对复杂,需要学到时另开新篇写。


部署Flask应用
http://blog.ulna520.com/2025/03/06/部署Flask应用_20250306_214237/
Veröffentlicht am
March 6, 2025
Urheberrechtshinweis