本文是凯文·戈德伯格(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由两个主要实体组成:
- Web服务器( Nginx,Apache等);
- 用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服务器的近距离观察:
Bjoern ,
uWSGI ,
mod_wsgi ,
Meinheld ,
CherryPy和
Gunicorn 。
比约恩
Bjoern是用C语言编写的异步WSGI服务器。它是
从零开始编写的,非常小巧,快速,它是使用Ryan Dahl(Node.js的创建者)的
http_parser和Mark Lehmann的
Libev事件
循环开发的 。
下载大小仅为18 KB,包含少于800行代码。 它占用不到1 MB的RAM,并且不使用
协程或线程。
Bjoern与
WSGI完全兼容,被认为是性能最高的
WSGI服务器之一。
Bjoern支持持久连接,并且可以绑定到Unix套接字或TCP地址。
Bjoern被认为比
Gunicorn更快,而比
uWSGI和
Meinheld则不那么肿。 该服务器的缺点之一是缺少带有清晰示例的常规文档。
uWSGI
uWSGI由
Unbit (意大利)开发,目标是成为能够创建托管服务的全栈解决方案。 它以
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应用程序,例如
CGI ,
FastCGI和
mod_python 。 它可以作为Apache模块安装,也可以通过
mod_wsgi express安装 。 第二种方法简化了对不太熟悉Apache的Python开发人员的安装。 其他好处:
•完整安装不需要root特权。
•创建了本地环境,这降低了对现有设置造成负面影响的风险。
由于该模块是由一名开发人员开发的,因此将
mod_wsgi作为一个项目进行开发可能看起来很慢。 另一个缺点是该文档目前组织不善,可能已过时。
当前,重点是在使用
Docker的环境中使用
mod_wsgi简化Apache的实现。
Meinheld
Meinheld由Yutaka Matsubara创建,是
WSGI兼容的服务器,它利用
picoev和
greenlet的功能来执行异步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服务器:
Bjoern ,
uWSGI ,
mod_wsgi ,
Meinheld ,
CherryPy和
Gunicorn 。 使用哪种服务器取决于您的应用程序的条件和要求。 下一部分将分析这六个WSGI服务器的性能。