Flask 高并发部署方案详细教程!
虽然标题写的是 Flask , 但是下面这个教程不仅仅只适用于 Flask, 还适用于其他Python web 框架 , 记得帮忙点赞!
众所周知 Flask 是一个同步的框架 , 处理请求的时候是以单进程的方式 , 当同时访问的人数过多时 , Flask 服务就会出现阻塞的情况 。
就像我们买火车票一样 , 当买火车票的人多的时候 , 排队的人就会很多 , 队伍就会很长 , 相应的等待的时间会变得很长!
因此 Flask, Django , webpy 等框架自带的 web server 性能都很差 , 只能用来做测试用途 , 线上发布则需要选择更高性能的 wsgi server。 这里推荐的部署方式:nginx + gunicorn + flask + supervisor
其中每个服务代表的含义如下:
- Nginx:高性能 Web 服务器+负载均衡;
- gunicorn:高性能 WSGI 服务器;
- gevent:把 Python 同步代码变成异步协程的库;
- Supervisor:监控服务进程的工具;
文章插图
Gunicorn
Gunicorn 可以指定多个工作进程 , 有多种工作模式可以供你选择 。 默认是同步的 sync 工作模式 , 除此之外还有 gevent, tronado, gthread, gaiohttp 等 。
这里推荐 gevent, gevent 是一个基于 Greenlet 库 , 利用 python 协程来实现 , 这样你的 web 服务才能实现并发的功能!
之前有写过关于 gunicorn 的一篇文章 , 详细使用指南点击查看!
一个高性能的web服务是如何搭建的?
Nginx
Nginx 实际上只能处理静态资源请求 , 那么对于动态请求怎么做呢 。 这就需要用到 Nginx 的 upstream 模块对这些请求进行转发 , 即反向代理 。 Nginx 在这里主要是用来做负载均衡 , 同时它能缓存一些动态内容
安装 nginx
安装命令如下:
sudo apt-get install nginx
nginx 安装完后 , 我们可以通过以下命令控制 nginx 的开启和关闭
sudo /etc/init.d/nginx restart // 重启
sudo /etc/init.d/nginx start 开启
sudo /etc/init.d/nginx stop 关闭
配置 nginx
Nginx 配置文件位于 /usr/local/nginx/conf/nginx.conf
server {
listen 8080; # 监听8080端口,可以自行配置
server_name localhost; # 配置域名
# 动态请求转发到 9600 端口(gunicorn):
location / {
proxy_pass ;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 300;
proxy_send_timeout 300;
}
}
修改完之后保存 , 重启 nginx.
Supervisor
安装 supervisor
命令如下:
pip install supervisor
初始化配置文件:
echo_supervisord_conf > supervisor.conf
修改配置文件 , 在配置文件最底部添加相应配置
[include] 自己的项目配置
[program:project]
directory = /home/jerry/Code/project ; 程序的启动目录
command = /home/jerry/.virtualenvs/parsing/bin/gunicorn -w 4 -worker-class gevent -bind 0.0.0.0:9600 app:app ; 启动命令
numprocs=1 ; number of processes copies to start (def 1)
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 1 ; 启动 1 秒后没有异常退出 , 就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数 , 默认是 3
user = root ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout , 默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小 , 默认 50MB
stdout_logfile_backups = 10 ; stdout 日志文件备份数
stdout_logfile=/home/jerry/Code/project/log/gunicorn.log ; log 日志
stderr_logfile=/home/jerry/Code/project/log/gunicorn.error ; 错误日志
编辑完之后保存 , 启动 supervisor 。 这里的启动命令和在命令行用 gunicorn 启动的命令是一致的 , 其中 -w 是指服务的进程数 , 详细命令查看我之前写的那篇文章哈 。
基本命令
通过配置文件启动 supervisor
supervisord -c supervisor.conf
查看 supervisor 的状态
supervisorctl -c supervisor.conf status
重新载入配置文件,每次修改之后记得重新载入
supervisorctl -c supervisor.conf reload
启动指定/所有 supervisor 管理的程序进程
supervisorctl -c supervisor.conf start [all]|[appname]
【Flask 高并发部署方案详细教程!】关闭指定/所有 supervisor管理的程序进程
supervisorctl -c supervisor.conf stop [all]|[appname]
这时候通过就能访问你的应用了! 想知道效果如何 , 可以自己测试一下 , 比如在代码中增加 sleep,或者自己动手写个脚本测试!
- 整形美容|双十一医美不良事件高发 热玛吉风险高 业内:医美职业打假人太少
- 华为|台积电、高通、华为、小米接连宣布!美科技界炸锅:怎么会这样!
- 设置|iPhone拍照小技巧:保留常用设置更高效
- 早报:高通骁龙888正式发布 嫦娥五号传回首张图片
- iphone12|菜鸟网络原副总裁被捕!此前多名高管被判刑
- 区企联企协|谋求更高质量的转型发展!区企联企协与区科技局成功举办科技考察对接活动
- 高配版|从4599元跌至3699元,256GB+65W,12GB旗舰加速退场
- 基建|深信服何朝曦:离开安全的“新基建”,就是在沙子上盖高楼
- 资本|2020年中国人工智能医疗行业发展现状分析 处于成长期且资本热度高
- 手机|用手机镜头展示丛林秘境,vivo S7带来的不止是高清