• nginx+gunicorn/uwsgi+python web 的前世今生


    我们在部署 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

  • 相关阅读:
    CDS是一个企业级的持续交付和DevOps自动化开源平台
    基于VictoriaMetrics的prometheus 集群监控报警方案
    VictoriaMetrics vmalert 重启状态的处理
    karma prometheus alertmanager dashboard简单试用
    kthxbye一种解决prometheus alertmanager 报警确认的守护进程
    karma 一个不错的prometheus alertmanager dashboard
    inversify 强大&&轻量级的基于typescript 的ioc 框架
    VictoriaMetrics vmagent的一些介绍
    VictoriaMetrics vmalert 说明
    VictoriaMetrics vmauth 说明
  • 原文地址:https://www.cnblogs.com/yanshw/p/11596308.html
Copyright © 2020-2023  润新知