对Gunicorn的架构进行简要描述

Posted 听风者也

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对Gunicorn的架构进行简要描述相关的知识,希望对你有一定的参考价值。

服务器模型

Gunicorn是基于预分叉的工作者模型。这意味着有一个中央主进程来管理一组工人进程。主进程从不知道任何关于单个客户的信息。所有的请求和响应都完全由工人进程处理。


主进程

主进程是一个简单的循环,它监听各种进程信号并作出相应的反应。它通过监听TTIN、TTOU和CHLD等信号来管理运行中的工作者列表。TTIN和TTOU告诉主进程增加或减少运行中的工作者的数量。CHLD表示一个子进程已经终止,在这种情况下,主进程会自动重新启动失败的工作者。


同步工作者

最基本的和默认的工作者类型是同步工作者类,它一次处理一个请求。这种模式是最简单的推理,因为任何错误最多只会影响一个请求。但正如我们在下面描述的那样,一次只处理一个请求需要对应用程序的编程方式做一些假设。


同步工作者不支持持久性连接 - 每个连接在发送完响应后就会关闭(即使您在应用程序中手动添加了 Keep-Alive 或 Connection: keep-alive 头)。


异步工作者

可用的异步工作者是基于Greenlets的(通过Eventlet和Gevent)。Greenlets是Python合作多线程的一个实现。一般来说,一个应用程序应该能够使用这些工作者类,而不需要做任何改变。


对于完全支持greenlet的应用程序可能需要进行调整。当使用Gevent和Psycopg时,确保psycogreen的安装和设置是有意义的。


其他应用程序可能完全不兼容,因为它们,例如,依赖于原始的未修补的行为。


龙卷风工作者

还有一个Tornado工作者类。它可以用来编写使用龙卷风框架的应用程序。尽管Tornado工作者能够为WSGI应用程序提供服务,但这并不是一个推荐的配置。


AsyncIO工作者

这些工作者与Python 3兼容。


工作器gthread是一个线程化的工作者。它在主循环中接受连接,接受的连接被添加到线程池中作为一个连接任务。在keepalive中,连接被放回循环中,等待事件发生。如果在保活超时后没有事件发生,连接就被关闭。


你也可以将你的应用程序移植到使用 aiohttp 的 web.Application API 并使用 aiohttp.worker.GunicornWebWorker 工作器。


选择一个工作器类型

默认的同步工作器假定你的应用程序在CPU和网络带宽方面是有资源限制的。一般来说,这意味着你的应用程序不应该做任何需要不确定时间的事情。一个需要未定义时间的例子是对互联网的请求。在某些时候,外部网络会出现故障,客户会堆积在你的服务器上。因此,从这个意义上说,任何向API发出请求的网络应用都会从异步工作者中受益。


这种资源约束的假设就是我们在默认配置的Gunicorn前面需要一个缓冲代理的原因。如果你将同步工作者暴露在互联网上,通过创建一个将数据滴入服务器的负载,DOS将变得微不足道。对于好奇的人来说,Hey是这种类型的负载的一个例子。


一些需要异步工作者的行为的例子。


应用程序进行长时间的阻塞性调用(例如,外部网络服务)

直接向互联网提供请求

流动的请求和响应

长时间轮询

网络套接字

彗星


以上是关于对Gunicorn的架构进行简要描述的主要内容,如果未能解决你的问题,请参考以下文章

Heroku 上带有 gunicorn 服务器的 Django 项目不提供静态文件

对文件进行更改时重新启动 Gunicorn/Nginx

flask&nginx&gunicore??????

在 nginx/gunicorn/django Web 架构中有效处理长时间运行的 HTTP 连接

部署了解nginx+gunicorn+django架构

部署了解nginx+gunicorn+django架构