WSGI服务器简介:第一部分

本文是凯文·戈德伯格(Kevin Goldberg)的文章“ Python WSGI服务器简介:第1部分”的译文 ,翻译者为翻译人员的少量补充, 网址为blog.appdynamics.com/engineering/an-introduction-to-python-wsgi-servers-part-1

图片

WSGI Python服务器的简要历史


出现WSGI服务器的原因是当时的Web服务器无法与用Python编写的应用程序进行交互。 WSGI发音为“ whiz-gee”,带有实心的“ g” )由Philip J. Ebi(以及Ian Biking等人)于2000年代初期开发。 Grigory Trubetskoy在90年代后期开发的Apache模块,称为mod_python ,当时处理了大多数Python应用程序。 但是, mod_python不是官方规范。 它只是为了让开发人员可以在服务器上运行Python代码而创建的。 不幸的是,这种方法不安全,开发人员开始寻找新的解决方案。

WSGI (Web服务器网关接口)是CGI (通用网关接口)的后代。 当网络开始发展时,由于大量语言的支持以及缺乏其他解决方案, CGI得以发展。 然而,该解决方案是缓慢且有限的。 WSGI被开发为用于将请求从Web服务器(Apache,Nginx等)路由到Web应用程序的接口。

服务器和Web应用程序


在最简单的情况下, WSGI由两个主要实体组成:

  1. Web服务器( Nginx,Apache等);
  2. 用Python编写的Web应用程序。

工作原理:


Web服务器执行该代码,并将与http请求关联的信息和回调函数发送到Web应用程序。 然后,处理应用程序侧的请求,并将响应发送到Web服务器。

图片

在Web服务器和Web应用程序之间,定期存在一个或多个中间层。 这样的层例如允许在多个Web应用程序和所传递内容的预处理(预处理)之间进行平衡。

以下是支持WSGI的框架示例:


为什么选择WSGI?


您可能会问: “好,但是为什么要使用WSGI?” 。 这有几个原因:

  • WSGI服务器旨在一次处理许多请求。 而且,这些框架并非旨在处理成千上万的请求,也没有决定如何从Web服务器最佳地路由它们(请求)。
  • WSGI加快了用Python编写的Web应用程序的开发。 如果您在网络应用程序开发中使用框架(Django或其他工具),则无需担心您的特定基础架构如何使用WSGI标准。
  • WSGI使您可以灵活地修改Web堆栈组件,而无需更改与WSGI一起使用的应用程序。

WSGI服务器有各种变体。 一些针对全栈解决方案,而另一些则非常适合特定框架。 例如, Gunicorn即开即用地Django合作 。 这是当今市场上六款WSGI服务器的近距离观察: BjoernuWSGImod_wsgiMeinheldCherryPyGunicorn

比约恩


Bjoern是用C语言编写的异步WSGI服务器。它是从零开始编写的,非常小巧,快速,它是使用Ryan Dahl(Node.js的创建者)的http_parser和Mark Lehmann的Libev事件循环开发的
下载大小仅为18 KB,包含少于800行代码。 它占用不到1 MB的RAM,并且不使用协程或线程。 BjoernWSGI完全兼容,被认为是性能最高的WSGI服务器之一。
Bjoern支持持久连接,并且可以绑定到Unix套接字或TCP地址。 Bjoern被认为比Gunicorn更快,而比uWSGIMeinheld则不那么肿。 该服务器的缺点之一是缺少带有清晰示例的常规文档。

uWSGI


图片

uWSGIUnbit (意大利)开发,目标是成为能够创建托管服务的全栈解决方案。 它以WSGI标准命名,并作为公司项目之一的插件创建。

uWSGI是一个范围广泛且不断发展的项目, 使您可以做的不仅仅是Web托管应用程序。 许多人发现uWSGI是一个强大的工具,而其他人则觉得它有些WS肿。 从2.0版开始,uWSGI还支持使用Lua,Perl,Ruby和其他语言启动Web应用程序。

mod_wsgi


mod_wsgi是Graham Dumpleton(以前是mod_python开发人员之一)开发的Apache HTTP服务器模块,为Web应用程序提供WSGI接口。 与Python2和Python3语言版本兼容。 创建为其他解决方案的替代方案,用于集成Web应用程序,例如CGIFastCGImod_python 。 它可以作为Apache模块安装,也可以通过mod_wsgi express安装 。 第二种方法简化了对不太熟悉Apache的Python开发人员的安装。 其他好处:

•完整安装不需要root特权。
•创建了本地环境,这降低了对现有设置造成负面影响的风险。

由于该模块是由一名开发人员开发的,因此将mod_wsgi作为一个项目进行开发可能看起来很慢。 另一个缺点是该文档目前组织不善,可能已过时。

当前,重点是在使用Docker的环境中使用mod_wsgi简化Apache的实现。

Meinheld


Meinheld由Yutaka Matsubara创建,是WSGI兼容的服务器,它利用picoevgreenlet的功能来执行异步I / O。 它可以与独立的HTTP服务器一起使用,也可以通过Gunicorn使用

Meinheld对名为greenlet的第三方组件具有依赖性。

源代码存储库位于GitHub上Meinheld支持Web套接字,并在其他模块上包括多个猴子补丁 ,以增强功能。

小樱桃


图片
CherryPy-众所周知的用于编写Web应用程序的简约Python框架, CherryPy还带有WSGI线程池化的Web服务器,并支持HTTP / 1.1协议。 CherryPy开发团队将其Web服务器描述为可用于生产环境的高速线程池HTTP服务器。 他有:

•快速,简单的设置;
•可扩展性;
•适用于您的Python应用程序的小型易用解决方案;
•SSL支持。

CherryPy的易用性和开发者的便利性使其与知名的WSGI服务器区分开来。 您可以在几分钟内编写一个小型Web应用程序,方法是在多个进程中运行该应用程序,然后仅创建一个名为server.py的文件。 通过将CherryPy与Nginx作为代理服务器结合使用,您将获得一种可靠的方式来服务Web应用程序。 CherryPy由Remy Delon创建。 他想创建一个尽可能接近Python开发主要原理的结构

独角兽


图片

Gunicorn是设计用于UNIX系统的WSGI 服务器 。 该名称是“绿色独角兽”一词的缩写和组合版本。 项目现场本身上有一个绿色的独角兽。 Gunicorn已从Ruby的Unicorn项目移植而来。 它相对较快,占用大量资源,易于启动,并且可以与各种Web框架一起使用。

开发团队建议将Gunicorn与Nginx结合使用,其中Nginx用作代理服务器。

结论


在本文中,目前分析了六个最受欢迎的WSGI服务器: BjoernuWSGImod_wsgiMeinheldCherryPyGunicorn 。 使用哪种服务器取决于您的应用程序的条件和要求。 下一部分将分析这六个WSGI服务器的性能。

Source: https://habr.com/ru/post/zh-CN426957/


All Articles