gunicorn gevent,guns框架

  gunicorn gevent,guns框架

  

简介

  Gunicorn“绿色独角兽”是一款广泛使用的高性能Python WSGI UNIX HTTP服务器,移植自Ruby的独角兽项目。它使用pre-fork worker模式,具有使用非常简单、资源消耗少、性能高的特点。

  Gunicorn server作为wsgi app的容器,可以兼容各种Web框架(flask、django等。).得益于gevent等技术,使用Gunicorn可以在基本不改变wsgi app代码的情况下,大幅提升wsgi app的性能。

架构

服务模型(Server Model)

  Gunicorn基于前叉模型。这也意味着有一个主进程来管理工作进程集。主人从来不了解客户。的所有请求和响应都由工作进程处理。

Master(管理者)

  主程序是一个简单的循环,监视各种信号和相应的响应过程。Master管理正在运行的worker的集合,并通过监听各种信号(如TTIN、TTOU和CHLD)来增加和减少worker的数量。TTIN和TTOU。CHL信号表示子进程已经结束。在这种情况下,主服务器将自动重启失败的工作进程。

worker

  woker有很多种,包括:ggevent,geventlet,gtornado等等。这里主要分析的是ggevent。

  每个ggevent worker启动时都会启动多个服务器对象:worker首先为每个监听器创建一个服务器对象(注意:为什么是一组监听器,因为gunicorn可以绑定一组地址,每个地址都是针对一个监听器的),每个服务器对象运行在一个单独的gevent池对象中。等待链接和处理链接的实际操作是在服务器对象中执行的。

  #为每个侦听器创建一个服务器对象。在自我中。sockets:pool=pool(self . worker _ connections)#如果self.server _ class不为none,则创建gevent池:#创建服务器对象server=self.server_class(s,Application=self.wsgi,spawn=pool,log=self.log,handler _ class=self . wsgi _ handler,* * SSL _ args)..server.start () #启动服务器并等待链接,链接servers.append(server)..上面代码中的server_class实际上是gevent的WSGI SERVER的一个子类:

  类PyWSGIServer(pywsgi。WSGIServer):

  base_env=BASE_WSGI_ENV

  请注意,用于构造PyWSGIServer的参数是:

  self.server_class(

  s,application=self.wsgi,spawn=pool,log=self.log,

  handler _ class=self . wsgi _ handler,**ssl_args)

  这些参数中的s是服务器用来监听链接的套接字。Spawn是gevent可爱的花。Application就是我们的wsgi app(通俗点说就是你用flask或者django写的app)。这就是我们的应用程序如何被交给gunicorn的woker来运行的。Handler_class是pywsgi。gevent的WSGIHandler子类。

  当所有的服务器对象都被创建后,worker需要定期通知manager,否则会被认为是死的。

  而self.alive:

  self.notify()

  .

  这个地方的通知机制的设计很有趣。每个工人都有一个相应的tmp文件。每次通知都可以操作这个tmp文件(比如通过os.fchmod),这个tmp文件最后一次更新的时间戳就会更新。管理器通过检查对应于每个工作者的临时文件的最后更新的时间戳来判断进程是否被挂起。

WSGI SERVER

  真正的等待链接和处理链接的操作是在gevent的WSGIServer和WSGIHandler中进行的。

  最后,我们来看看gevent的WSGIServer和WSGIHandler的主要实现:

  WSGIServer的start函数调用start_accepting来处理传入的链接。在start_accepting中获取接收到的套接字后,调用do_handle来处理套接字:

  def do_handle(self,*args):

  spawn=自我。_spawn

  产卵(自我。_handle,*args)

  可以看到,WSGIServer实际上是创建了一个处理socket的进程,也就是说,在WSGIServer中,一个进程单独负责一个HTTP链接。自我。运行在协同进程中的_handle函数实际上调用了WSGIHandler的handle函数来连续处理http请求:

  def Handle(self):try:while self . socket不为None:result=self . Handle _ one _ request()# Handle HTTP请求ifresult为none: break ifresult为true: continueself.status,Response _ body=resultself。socket.sendall (response _ body) #发送响应消息..在句柄函数的循环中。handle_one_request函数首先读取HTTP请求,初始化WSGI环境,最后调用run_application函数处理请求:

  定义运行_应用程序(自身):

  self . result=self . application(self . environ,self.start_response)

  self.process_result()

  只有在这个地方,我们才真正称之为我们的app。

  总结:gunicorn会启动一组worker进程,所有worker进程共享一组监听器,为每个worker中的每个监听器建立一个wsgi服务器。每当HTTP链接到达时,wsgi server都会创建一个协议来处理该链接。协议处理链接时,首先初始化WSGI环境,然后调用用户提供的app对象处理HTTP请求。

安装Gunicorn

  方法1:安装或更新最简单的方法是使用easy_install。

  安装gunicorn模式2:下载源代码并安装

  1 git clone git://github . com/benoitc/Gunicorn . git 2 CD guni corn 3 sudo python setup . py install如果希望guni corn支持异步工作器,需要安装三个Python包。

  1 _ install-u greenlet 2 Easy _ install-u event let 3 Easy _ install-u Gevent说明:如果Greenlet安装失败,需要安装Python头文件。

  1 sudo apt-get安装python-dev gunicorn还需要库函数libevent (1.4.x或2.0.4)

运行Gunicorn

  gunicorn安装成功后,可以直接使用以下三条指令启动gunicorn运行wsgi应用或wsgi框架。

  1 guni corn 2 guni corn _ django 3 guni corn _ paster guni corn服务器最基本的命令直接用来运行最基本的wsgi应用。用法:

  1 gunicorn[options]app _ module options可选参数运行guni corn的配置选项,后面会讲到。

  APP_MODULE指定wsgi应用程序文件,以$(MODULE_NAME):$(VARIABLE_NAME)的格式编写。module_name用于制定要运行的wsgi应用程序文件,但它是一个完整的修饰名。例如,如果当前目录的myapp目录下有一个Python包gunicorn _ app,并且有一个wsgi应用文件test.py gunicorn_app,gunicorn_app包,那么module_name可以直接写成gunicorn_app.test。Viriable_name表示要在module_name文件中调用的对象的名称(它是WSGI可调用的,可以是函数。有关类的详细信息,请参见WSGI规范)。

  根据上面的例子,当前目录是/home/user/myapp,myapp中有一个包gunicorn_app。test.py代码如下:

  def app(environ,start_response): 最简单的可能应用对象 data=Hello,World! n status= 200 OK Response _ headers=[( Content-type , text/plain ),( Content-len ,str(len(data))]start _ Response(status,Response _ headers)return ITER([data])我们准备在test.py文件中运行app(当然名字由你自己定,可以是myapp,demo等。)

  1 guni corn guni corn _ app . test:app命令中的module_name为guni corn _ app . test;Viriable_name是app。当然,如果我们像这样直接运行Gunicorn,那么Gunicorn的所有配置都是默认值。后面会讲到如何配置Gunicorn。

  古尼科恩-姜戈

  Guniorn_django命令用于将Django app部署到Gunicorn服务器。

  其实很简单。原理和gunicorn一样,只是gunicorn_django做了特殊处理,使其更适合Django

基本用法

  guni corn _ django[选项][设置_路径]设置_路径django app中settings.py文件所在的目录。如果不写,默认会在当前目录下找到。例如,gunicorn_django用法适用于Django 1.4之前。gunicorn命令(强烈推荐)1django _ admin.py启动项目my site 2cd my site 3gg unicorn my site . wsgi:Django 1.4版本推荐使用application

Gunicorn配置

  Gunicorn从三个不同的地方读取配置信息。

  第一个地方:从框架定义的配置信息中读取,目前只对贴片框架有效。

  第二个地方:在命令行中定义。命令行中定义的配置信息将覆盖框架中定义的相同参数名称的值。

  最后,把所有的参数信息放在一个文件中,只要是在命令行可以定义的参数,都可以在配置文件中定义。(是Python源文件,所以就像写Python代码一样)

  第一个地方不得不介绍。不实用。重点介绍第二种和第三种方法。其实这两种方法是一样的。

  它说有配置选项:

  1使用命令行配置gunicorn -h:

  根据上述多年期应用方案的例子

  1 guni corn-workers=4-bind=127.0.0.1: 8000 myapp . test:app上面的命令启动4个worker,绑定到127 . 0 . 0 . 1:8000。

  配置文件config.py源代码

  1导入多处理2 3 bind= 127 . 0 . 0 . 1:8001 4 workers=multi processing . CPU _ count()* 2 1用配置文件启动Gunicorn。

  1 guni corn-config=config . pymyapp . test:App和上面用命令行配置的效果完全一样。当然,这两者也可以结合使用:

  1 guni corn-config=guni corn _ conf . py-worker-class=eventletmyapp . test:app worker-class默认为sync(同步),我们配置为eventlet(并发)。

  转发代理服务器软件

  CGI-proxy proxy(中断)Glype互联网审查Wiki:Web代理列表反向代理服务器软件

  Apache Mod _ proxysquidproxybalportfusionboundtcp上的反向代理服务器软件

  平衡委托penportfusionpure负载平衡器python director参考

  http://gunicorn.org/

  http://gunicorn.readthedocs.io/en/latest/

gunicorn gevent,guns框架