我们在部署 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. 关于SpringBoot跨域的问题

    直接在启动类里面加这一段代码就行: @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource sourc ...

  2. UFLDL(Unsupervised Feature Learning and Deep Learning)

    UFLDL(Unsupervised Feature Learning and Deep Learning)Tutorial 是由 Stanford 大学的 Andrew Ng 教授及其团队编写的一套 ...

  3. Python tuple 元组

    Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 ...

  4. SpringBoot2.X&Prometheus使用

    1.启动Prometheus [root@ip101 prometheus-2.12.0.linux-amd64]# pwd /opt/app/prometheus-2.12.0.linux-amd6 ...

  5. 为什么有些应用非VxWorks不可

          实时操作系统(RTOS)是专用于对时间精确度敏感的操作系统.典型的情况是,这种应用需要从传感器收集数据.做出分析并对关键性设备进行控制,例如飞机.列车.手术刀.这类控制必须精准,不容许出现 ...

  6. ShareX的使用

    给截图设置边框 https://github.com/ShareX/ShareX/issues/2509 TaskSettings-->Image-->Effects-->image ...

  7. koa 基础(九) ejs 模板引擎的使用

    1.app.js /** * ejs 模板引擎的使用: * 1.npm install koa-views --save * 2.npm install ejs --save * 3.var view ...

  8. Hive数据提取

    Hive是基于Hadoop的ETL工具和数据仓库. 结构化数据 结构化数据就像RDBMS hive> create table structured_table(id int, name str ...

  9. jquery 复合事件 toggle()方法的使用

    定义和用法 toggle() 方法用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的 click 事件. 语法: $(selector).toggle(function1(),function2 ...

  10. 自然语言20.1 WordNet介绍和使用

     https://study.163.com/provider/400000000398149/index.htm?share=2&shareId=400000000398149(欢迎关注博主 ...