我们在部署 flask、django 等 python web 框架时,网上最多的教程就是 nginx+gunicorn/uwsgi 的部署方式,那为什么要这么部署呢,本文就来系统地解释这个问题。

必备概念

WSGI

这里必须要知道的一个概念,WSGI,web service gateway interface,网络服务网关接口

它不是 web server,也不是 web application,它是架在 server 和 application 之间的一种协议和规范。

WSGI 的目的就是解耦 web server 和 web application,它包括两个部分,server 和 application,server 用来接收 web 客户端的请求,application 用来接收 server 传来的请求,然后传给 web server

gunicorn

gunicorn 和 uWsgi 就是实现了 WSGI 协议的 web server;

而 flask、django 等 web 框架也是用的 wsgi 协议,所以需要在 web framework 之前加上 gunicorn 或者 uwsgi

话说回来,python web 框架都自带 wsgi 服务器,为什么还要 这俩呢?一句话,性能太差,只能用于开发环节,具体不做过多解释

nginx

nginx 是干什么的呢?参考我的博客 nginx

多层部署的原理

这三者结合起来的效果是什么呢, 我做个简单比喻

flask webServer + flask app:弱鸡版的server,单进程(单 worker),该进程挂掉,web 服务挂掉;无法管理

gunicorn + flask app:多进程(多 worker)server,失败自动重启该 worker,看起来不错哦;简单管理

nginx + gunicorn + flask app:反向代理,负载均衡,是不是更牛了;

多 nginx + 多 gunicorn + 多 web app:大型多实例 web server,一般还会给 gunicorn 挂上 supervisor;

四种模式详解

第一种 server 是 web framework 自带的框架,很容易挂掉,单 worker 工作对多核 cpu 服务器来说是一种浪费;

无法对 worker 进行管理,挂了你不知道,你知道了也只能重启;

而 gunicorn 是可以对 worker 进行管理的

第二种 server 加上了 gunicorn,gunicorn 相当于是开启了多个进程,它具有以下优点:

1. 可以调节 worker 的数量,在请求较多时,自动新增 worker,请求较少时,自动减少 worker;

2. 帮我们管理 worker,worker 挂了自动重启

3. 支持多种配置

4. 各种框架都适用,且部署方法相同

补充:gunicorn 的 管理机制

在管理 worker 上,gunicorn 使用了 pre-fork 模式,即一个 master 进程管理多个 worker 进程,所有请求和响应都由 worker 执行,master 就是一个 loop,监听 worker 不同进程信号并且作出响应。

比如接受到 TTIN 提升 worker 数量,TTOU 降低运行 Worker 数量。如果 worker 挂了,发出 CHLD, 则重启失败的 worker, 同步的 Worker 一次处理一个请求。

看起来不错,但存在以下问题:

1. gunicorn 如果要实现复杂功能,其配置比较复杂

2. gunicorn 有些功能是无法实现的,比如 访问控制、限速、限制连接数等

3. gunicorn 不支持 https,当然高版本支持,但是不如 nginx

4. gunicorn 不支持 http1.1

5. gunicorn 无法扛住巨大的并发量

第三种 server 加上 nginx,只为更加高效更加健壮的 web 服务,nginx 的作用

1. 负载均衡:有效的调度 request,而 gunicorn 虽然是多进程,但是没不能 主动地 对 request 进行调度

2. 动静分离:经过配置后,nginx 可以直接处理静态请求,而无需经过 python web 服务器,这一点 gunicorn 没有

3. 缓存 request 和 response:web 请求包含各种浏览器和各种网络,故 http 请求的发起是一个比较慢的过程,而 gunicorn 需要等待整个请求结束,才处理该请求,并且等 web server 接收完这个请求后,才继续下一个;

nginx 可以缓存客户端的请求,收完整个请求后,转发给 gunicorn,等 gunicorn 返回 response 后,再转发给客户端;

这是 nginx 擅长,而 gunicorn 不擅长

第四种 server 可以通过 nginx 实现 多后端、跨语言后端等 高可用 的负载均衡 web 服务器

总结

只做适合的事,没有绝对的谁只能做什么事;

nginx 功能强大,适合做管理,适合大规模的 web

gunicorn 多进程,充分利用服务器资源,可以支持一些并发量不大的web

总图

参考资料:

https://zhuanlan.zhihu.com/p/36268647  WSGI及gunicorn指北(一)

https://www.zhihu.com/question/297267614/answer/505683007  nginx和gunicorn和flask的关系?

https://www.zhihu.com/question/38528616

nginx+gunicorn/uwsgi+python web 的前世今生的更多相关文章

  1. nginx上部署python web

    nginx上部署python web http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

  2. supervisor+gunicorn部署python web项目

    有了Nginx,对于Tomcat没有必要详细了解. 有了supervisor,再也没有必要把一个程序设置成服务.驻留进程,supervisor真是一个相见恨晚的好工具. 在Tomcat中,所有的web ...

  3. 关于Nginx+Gunicorn+uwsgi+后端框架到app架构梳理和思考

    今天下午在思考以前一直在疑惑的问题.也就是在拥有nginx这样的服务器存在了为什么还需要uwsgi这样的服务器.他们之间究竟是什么关系. 我一直在疑惑分层的问题,今天也在这里总结写出我的思考. 首先上 ...

  4. 使用gunicorn部署python web

    gunicorn 是一款支持wsgi的web服务器, 支持gevent 首先安装setuptools.  wget https://bootstrap.pypa.io/ez_setup.py $pyt ...

  5. virtualenv 环境下 Nginx + Flask + Gunicorn+ Supervisor 搭建 Python Web

    在这篇文章里,我们将搭建一个简单的 Web 应用,在虚拟环境中基于 Flask 框架,用 Gunicorn 做 wsgi 容器,用 Supervisor 管理进程,然后使用 Python 探针来监测应 ...

  6. 将树莓派变成一个web服务器(2):Nginx+Flask+uWSGI部署全过程

    1)安装Flask,uwsgi,nginx sudo apt-get update sudo apt-get install python-flask #Flask sudo apt-get inst ...

  7. 建议使用nginx配合uwsgi,

    试试gunicorn+supervisor+nginx. gunicorn是Python实现的的Web server,配置也比较简单. supervisor也是Python实现的,它用于进程管理. 这 ...

  8. 如何使用Nginx和uWSGI或Gunicorn在Ubuntu上部署Flask Web应用

    你好!欢迎阅读我的博文,你可以跳转到我的个人博客网站,会有更好的排版效果和功能. 此外,本篇博文为本人Pushy原创,如需转载请注明出处:https://pushy.site/posts/151981 ...

  9. nginx+uwsgi部署python web(web.py)

    1.nginx: nginx 是一个 http 服务器,与 apache.lighttpd.Microsoft IIS 等属于同类产品. 2.uWSGI: uWSGI 是一个快速的.纯C语言开发的.自 ...

随机推荐

  1. node链接mongoDB及封装

    // 这个模块中封装所有对数据库的常用操作 const MongoClient = require('mongodb').MongoClient; const assert = require('as ...

  2. 安装lanproxy服务端、客户端以及小问题解决

    准备 我们这里使用java客户端与服务端连接 1.一台公网服务器(运行proxy-server).2.一台内网客户端(运行proxy-client). 下载地址:https://seafile.cdj ...

  3. Oracle-sql*plus

    连接命令 (1)conn[ect] 用法: conn 用户名/密码@网络服务名 [as sysdba/sysoper] 当用特权用户身份连接时,必须带上 as sysdba 或是 as sysoper ...

  4. excel中如何设置只打印第一页

    在打印表格时,怎样设置只打印第一页呢,操作很简单,下面,小编说下操作方法.   方法/步骤     打开要打印的工作表, 再点击“文件”   弹出的页面中,在左侧这里,点击“打印”   在右边弹出与打 ...

  5. nginx环境准备

    一.环境调试确认 1.四项确认 确认公网已连通. 确认yum源可用. 确认iptables已经关闭. 确认selinux已经关闭. a.确认是否连通公网. ping www.baidu.com b.确 ...

  6. MIL/SIL/PIL/HIL/VIL

    MIL:Model in the loop 模型在环,对模型在模型的开发环境下(如SIMULINK)进行仿真,通过输入一系列的测试用例,验证模型是否满足设计的功能需求.验证控制算法模型是否准确地实现了 ...

  7. JSTL标签(核心标准库)

    使用JSTL标签步骤 1) 导入jstl支持的jar包(标签背后隐藏的java代码) 注意:使用javaee5.0的项目自动导入jstl支持jar包 2)使用taglib指令导入标签库 <%@t ...

  8. flask_sqlalchemy的session线程安全源码解读

    flask_sqlalchemy是如何在多线程中对数据库操作不相互影响 数据库操作隔离 结论:使用scoped_session实现数据库操作隔离 flask的api.route()接收一个请求,就会创 ...

  9. oracle 导入关键字说明

    关键字 说明(默认) ----------------------------------------- UserId 用户名/口令 Full     导入整个文件(N) Buffer 数据缓冲区的大 ...

  10. 內部作业 OH01 0001710000 无价格可确定

    在CO15报工时,提示:“內部作業 OH01 0001710000 無價格可確定” 出现以上错误信息,表示没有在KP26维护价格, 只需要进入KP26维护成本中心和作业类型的价格即可, 具体操作如下图 ...