对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 项目不提供静态文件