Flask 高并发部署方案详细教程!

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Flask 高并发部署方案详细教程!

640.jpg

前言

虽然标题写的是 Flask,但是下面这个教程不仅仅只适用于 Flask, 还适用于其他Python web 框架,记得帮忙点赞!

众所周知 Flask 是一个同步的框架,处理请求的时候是以单进程的方式,当同时访问的人数过多时,Flask 服务就会出现阻塞的情况。

就像我们买火车票一样,当买火车票的人多的时候,排队的人就会很多,队伍就会很长,相应的等待的时间会变得很长!

因此 Flask, Django,webpy 等框架自带的 web server 性能都很差,只能用来做测试用途,线上发布则需要选择更高性能的 wsgi server 。这里推荐的部署方式:nginx + gunicorn + flask + supervisor

其中每个服务代表的含义如下:

  • Nginx:高性能 Web 服务器+负载均衡;
  • gunicorn:高性能 WSGI 服务器;
  • gevent:把 Python 同步代码变成异步协程的库;
  • Supervisor:监控服务进程的工具;

这里有张图,能让你有个更直观的感受

640.png

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   http://127.0.0.1:9600;
        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]

关闭指定/所有 supervisor管理的程序进程

supervisorctl -c supervisor.conf stop [all]|[appname]

这时候通过 http://127.0.0.1:8080 就能访问你的应用了! 想知道效果如何,可以自己测试一下,比如在代码中增加 sleep,或者自己动手写个脚本测试!




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6月前
|
安全 网络安全 数据安全/隐私保护
Flask 入门系列教程(六)
Flask 入门系列教程(六)
|
5月前
|
Python
python3之flask快速入门教程Demo
python3之flask快速入门教程Demo
75 6
|
5月前
|
消息中间件 数据挖掘 程序员
【建议收藏】高并发下的分布式事务:如何选择最优方案?
本文介绍了分布式事务的三种常见解决方案。在分布式系统中,事务处理变得复杂,需确保ACID特性。TCC(Try-Confirm-Cancel)方案适用于严格资金要求的场景,如银行转账,通过预留、确认和取消步骤确保一致性。可靠消息最终一致性方案适合一致性要求较低的场景,如电商积分处理,通过消息中间件实现最终一致性。最大努力通知方案则用于允许不一致的场景,如数据分析,通过重复通知尽可能达成一致性。选择合适的方案取决于具体应用场景。
132 5
|
12天前
|
存储 关系型数据库 MySQL
阿里云PolarDB解决游戏行业全球部署高并发问题
阿里云PolarDB解决游戏行业全球部署高并发问题
|
3月前
|
存储 Linux 开发工具
【Azure App Service】本地Git部署Python Flask应用上云(Azure App Service For Linux)关键错误
【Azure App Service】本地Git部署Python Flask应用上云(Azure App Service For Linux)关键错误
|
3月前
|
消息中间件 负载均衡 应用服务中间件
高并发环境下的Nginx整合方案
【8月更文挑战第20天】在高并发环境下,整合Nginx代理服务器、静态文件服务器、Tomcat集群、Mycat数据库读写分离和消息队列,可以构建一个强大、灵活且可扩展的Web服务架构。
41 1
|
3月前
|
Ubuntu Apache Python
如何在 Ubuntu VPS 上部署 Flask 应用程序
如何在 Ubuntu VPS 上部署 Flask 应用程序
29 1
|
3月前
|
Python Windows 内存技术
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?
|
4月前
|
负载均衡 微服务
微服务06----Eureka注册中心,微服务的两大服务,订单服务和用户服务,订单服务需要远程调用我们的用,户服务,消费者,如果环境改变,硬编码问题就会随之产生,为了应对高并发,我们可能会部署成一个集
微服务06----Eureka注册中心,微服务的两大服务,订单服务和用户服务,订单服务需要远程调用我们的用,户服务,消费者,如果环境改变,硬编码问题就会随之产生,为了应对高并发,我们可能会部署成一个集
|
6月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的高并发慕课网的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的高并发慕课网的详细设计和实现(源码+lw+部署文档+讲解等)