基于 Python 网络应用程序的网络服务器比较

简介


在这篇文章中,我们将讨论三个主要的东西:Python,Web服务器,以及最重要的两者之间的小东西。

撇开笑话不谈,这篇相当长的文章对于那些寻求快速指导或答案的人来说可能看起来很可怕。不幸的是,与Python界中的大多数事情不同,当涉及到选择在其上部署应用程序的生产服务器堆栈时,没有1,最好只有一种--显而易见的方法

然而,这不应该吓到你。读完本文后,您将很好地了解不同的Web服务器是如何工作的,并处理与基于Python的Web应用程序对话的任务。在衡量您的需求和要求之后,您将能够决定使用哪台服务器。

Python Web服务器网关接口v1.0(WSGI)


了解问题


今天,有越来越多的Web服务器(或服务器模块)专门设计(或调整)用于与Python Web应用程序互换工作。然而,情况并非总是如此。在过去,开发人员并没有真正能够轻松地随意切换Web服务器,并且由于依赖性和限制,每个切换都有成本。在决定构建一个框架时,您也会决定(并不总是自愿或有意识地)您可以用来为应用程序提供服务的服务器。这是由于缺乏一个普遍接受的[interface specification](www.sei.cmu.edu/architecture/start/glossary/):一个应用程序(框架)和Web服务器都将适应和使用的共同基础,允许组件在必要时可互换性,可能零代码更改。

标准诞生


本世纪初,为了最终解决这一问题,人们向社会提出了Python增强提案(PEP)333。

来自PEP(PYTHON增强建议书)333

1This document specifies a proposed standard
2interface between web servers and Python web
3applications or frameworks, to promote web
4application portability across a variety of
5web servers.

正如PEP中解释的那样,这个新标准过去(现在也是)意味着允许在[Web]服务器和[Python Web]应用程序之间(以及在它们之间)可移植。与以前的标准相比,该标准的强大功能和广泛采用引领着今天的道路:一个有很多(可能太多)愿意为你做这项工作的网络服务器的世界。

对比


在这次对基于Python的Web应用程序的Web服务器的比较中,我们将讨论一些可用的选择,以及是什么让它们脱颖而出。这里的目的是让读者有一个更清晰的愿景,并提供帮助,以匹配服务器与应用程序的定制需要找到的那个人。由于有大量的选择(每天都有更多的选择出现!),我们会筛选出我们的方式,并用不同的方式谈论那些)的事情。

注意: 我想建议读者警惕有偏见和欺骗性的基准,因为这些基准往往不能反映真实生产环境的条件。不幸的是,当涉及到选择用于生产的Web服务器时,这些[文章]并没有真正的意义,这也极不可能是导致瓶颈的部分。因此,建议你衡量和了解自己的需求,然后尝试不同的选择,避免投机性的数字,以避免真正的未来灾难情景。

Web服务器(按字母顺序排列)


CherryPy WSGI服务器


是什么?

CherryPy实际上是一个Web框架。然而,它是一个完全独立的系统--这意味着它可以独立运行,包括在生产场景中,而不需要额外的软件。这要归功于它自己的WSGI,HTTP/1.1兼容的Web服务器。CherryPy项目将其描述为高速,生产就绪,线程池,通用HTTP服务器。因为它是一个WSGI服务器,所以它也可以用于服务任何其他WSGI Python应用程序,而不需要绑定到CherryPy的应用程序开发框架。

为什么要考虑使用它?

  • 紧凑而简单。
  • 它可以服务于任何运行在WSGI上的Python Web应用程序。
  • 它可以处理静态文件,并且只能用于单独提供文件和文件夹。
  • 它是线程池。
  • 它附带了对SSL的支持。
  • 它是一个易于适应、易于使用的纯Python替代方案,具有健壮和可靠的特点。

独角兽

这是什么

Gunicorn是一个独立的Web服务器,它以非常容易操作的方式提供了相当多的功能。它使用pre-fork模型-这意味着中央主进程(Gunicorn)的任务是管理启动的工作进程(不同类型),然后直接处理和处理请求。所有这些都可以进行配置和调整,以满足您的需求和多样化的生产场景。

为什么要考虑使用它?

  • 它支持WSGI,可以与任何运行Python应用程序和框架的WSGI一起使用。
  • 它还可以用来替代Paster(例如:金字塔)、Django的开发服务器、web2py等。
  • 提供各种工作类型/配置的选择和自动工作流程管理。
  • 通过同步和异步工作者支持HTTP/1.0和HTTP/1.1(Keep-Alive)。
  • 附带了对SSL的支持
  • 可通过挂钩进行扩展。
  • 透明,架构清晰。
  • 支持版本2.6、2.7、3、3.2、3.3

Tornado(通过wsgi.WSGIContainer的HTTP服务器)


是什么?

Tornado是一个应用程序开发框架和网络库,旨在处理异步操作,允许服务器维护大量打开的连接。它还附带了一个WSGI服务器,其他WSGI Python应用程序(和框架)可以使用它来运行。

为什么要考虑使用它?

  • 如果您在顶级Tornado框架上构建;或
  • 您的应用程序需要异步功能。

虽然在这些情况下,您可能希望为您的项目选择Tornado的WSGI服务器,但您也可以选择使用Gunicorn和Tornado [Asynchronous] worker。

扭曲的网络


是什么?

Twisted Web是Twisted网络库附带的Web服务器。Twisted本身是一个事件驱动的网络引擎,而_Twisted Web_服务器运行在WSGI上,它能够支持其他的PythonWeb应用程序。

为什么要考虑使用它?

  • 使用简单、稳定、成熟的产品。
  • 它将运行WSGI Python应用程序。
  • 它可以像一个Python Web服务器框架一样,允许您使用该语言对其进行编程,以实现自定义的HTTP服务目的。
  • 通过对HTTP请求执行的Python脚本(.rpy)提供简单快速的原型能力。
  • 它具有代理和反向代理功能。
  • 它支持虚拟主机。
  • 它甚至可以通过twisted.web.twcgi API服务于Perl、PHP等。

uWSGI


是什么?

尽管它的命名约定非常混乱,但[uWSGI](http://uwsgi-docs.readthedocs.org/en/latest/()本身就是一个包含许多组件的庞大项目,旨在为构建托管服务提供一个完整的[软件]栈。其中一个组件是uWSGI服务器,它运行Python WSGI应用程序。它能够使用各种协议,包括它自己的**uwsgi** 有线协议,这与SCGI几乎相同。为了满足在应用程序服务器前使用独立的HTTP服务器的(可以理解的)需求,NGINX和切诺基Web服务器被模块化以支持** uWSGi** ‘S(表现最好)** uwsgi** 协议,以直接控制其进程。

为什么要考虑使用它?

  • uWSGI自带WSGI适配器,完全支持运行在WSGI上的Python应用程序。
  • 与libpython链接。它在启动时加载应用程序代码,并充当Python解释器。它解析传入的请求并调用可调用的Python值。
  • 它直接支持流行的Nginx Web服务器(以及Cherokee* 和Lighttpd)。
  • 它是用C写的。
  • 它的各种组件可以做的不仅仅是运行一个应用程序,这可能有助于扩展。
  • 目前(截至2013年底),它正在积极开发,并具有快速的发布周期。
  • 它有用于运行应用程序的各种引擎(异步和同步)。
  • 这可能意味着运行时占用的内存更少。

服务员WSGI服务器


这是什么

Waitress是一个纯Python WSGI服务器。乍一看,它可能与许多其他公司没有太大不同;然而,它的发展理念将它与其他公司区分开来。它的目标是减轻由Web服务器给Python Web应用程序开发人员带来的生产(和开发)负担。女服务员通过中和平台引起的问题(例如Unix与Windows)、解释器(CPython与PyPy)和Python(版本2与版本3)的区别。

为什么要考虑使用它?

  • 这是一个非常精简的纯Python解决方案。
  • 支持HTTP/1.0和HTTP/1.1(Keep-Alive)。
  • 它具有广泛的平台支持,随时可以部署到生产中。
  • 与CherryPy不同,它实际上是独立于框架的。
  • 它可以在Windows和Unix上运行,也可以在CPython解释器和PyPy上运行(仅限Unix)。
  • 支持Python版本2和版本3。

单机模块


带WSGI适配器的mod_python(APACHE)(嵌入Python)

是什么?

简单地说,mod_python是一个Apache模块,它将Python嵌入服务器本身。虽然由于各种原因(项目已经死亡和过时,只有原作者最近才打算继续开发),但它可以通过包装器在Apache上运行WSGI应用程序。

为什么要考虑使用它?

出于特定的原因,您可能希望使用Python来编程和扩展Apache.

mod_wsgi(Apache)(嵌入Python)

是什么?

作为一个兼容WSGI的模块,mod_wsgi允许您在Apache HTTP服务器上运行PythonWSGI应用程序。它通过两种方式实现这一点:第一种方式类似于mod_python的工作方式,即在子进程中嵌入并执行代码。另一种方法提供基于守护进程的操作模式,其中WSGI应用程序有自己的不同进程,由mod_wsgi自动管理。

为什么要考虑使用它?

  • 现有的使用Apache的经验意味着在运行Python时也可以为您的运营提供稳定的生产环境。仅此一项就可以拯救世界,使之物有所值。
  • 如果你依赖于阿帕奇,或者想要利用它稳定而丰富的扩展模块,它将是你的选择。
  • 它可以在不同的系统用户下运行应用程序,以进一步提高安全性。
  • 这是一款经过测试、可靠的软件。
  • 万维网包含数以吨计的信息和与之相关的问答,当您遇到真正的生产问题时,这可以为您节省大量时间。
  • 它还附带了阿帕奇提供的所有其他功能。
Submitted by: O.S. Tezer
Tagged with
comments powered by Disqus