Flask 教程

Flask 生产环境部署详解


Flask 的启动在开发模式下,我们用 app.run 这种形式即可,但是如果要将 Flask 项目部署到生产环境需要考虑到高可用、高并发、分布式等线上环境的要求。这里主要介绍常用的一些做法。

开发模式

开发模式下,往往通过如下代码即可启动 flask 项目:

from flask import Flask


app = Flask(__name__)

......
......
......


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=6868, debug=True)

如上配置表示在项目在当前主机的 6868 端口启动服务,并监听请求。

生产环境部署

python 的 web 框架不管是 flask 还是 django 等,生产环境往往和 web server 搭配部署,flask 常和 gunicorn 一起使用。

gunicorn 安装

gunicorn 是一个 类unix 上被广泛使用的高性能的 python wsgi http server。它和大多数的 web 框架兼容,并具有实现简单,轻量级,高性能等特点。

安装如下:

pip install gunicorn

gunicorn 启动配置

gunicorn 启动往往指定配置信息,可以通过参数命令指定,也可以通过配置文件,示例 gunicorn-conf.py 文件如下:

import multiprocessing
import os
import platform

import gevent.monkey

gevent.monkey.patch_all()
debug = False
# 设置日志记录水平
loglevel = 'info'
# 服务地址(address:port)
bind = '0.0.0.0:6868'

if platform.system() == 'Windows':
    # win机器路径
    log_path = os.path.join(os.path.dirname(__file__), 'logs')
else:
    # 服务器路径
    log_path = 'logs'

# 设置进程文件目录
pidfile = log_path + '/gunicorn.pid'
logfile = log_path + '/gunicorn.log'
# 设置访问日志和错误信息日志路径
accesslog = log_path + '/gunicorn_access.log'
errorlog = log_path + '/gunicorn_error.log'

# 设置守护进程,将进程交给 supervisor 管理
daemon = 'false'
# 工作模式协程、默认 sync
worker_class = 'gevent'
# 启动的进程数(获取服务器的 cpu核心数 * 2 + 1)
workers = multiprocessing.cpu_count() * 2 + 1
# 指定每个工作者的线程数
threads = 20
# 设置最大并发量
worker_connections = 2000

x_forwarded_for_header = 'X-FORWARDED-FOR'

supervisor 启动项目

supervisor 是用 python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启,通常运维用其管理各种服务进程。

这里是通过 supervisor 来启动 gunicorn 服务,配置示例如下:

[program:xxx-server] # 项目名称
command=/usr/local/python3/bin/gunicorn -c gunicorn-conf.py app:app # gunicorn 指定配置文件启动项目
directory=/www/xxx-server # flask 项目存放路径
autorestart=true
stdout_logfile=/www/server/log/mock-server.out.log # 日志
redirect_stderr=true
user=root
priority=999

supervisor 相关命令,如下:

# 启动所有服务
sudo supervisorctl start all
  
  
# 启动单个服务
sudo supervisorctl start 服务名称
  
  
# 停止所有服务
sudo supervisorctl stop all
 
 
# 重启所有服务
sudo supervisorctl restart all