在本文中,我们将讨论三个主要内容:Python、Web 服务器,以及两者之间最重要的细节。
开玩笑的话,这篇相当长的文章对于一些寻求快速指导或答案的人来说可能看起来有些严肃。不幸的是,与 Python 世界中的大多数事物不同的是,当选择一个用于部署应用程序的生产服务器堆栈时,并没有一种——最好只有一种——明显的方法。
然而,这不应该吓到你。完成本文后,您将对不同的 Web 服务器如何工作以及如何处理与基于 Python 的 Web 应用程序交互的任务有很好的了解。在评估您的需求和要求后,您将能够决定使用哪个服务器。
如今,存在着越来越多专门设计(或适应)与 Python Web 应用程序可互换工作的 Web 服务器(或服务器模块)。然而,这并不总是这样。在古老的日子里,开发人员并没有真正的可能随意切换 Web 服务器,并且每次切换都会因依赖关系和限制而带来成本。在决定构建的框架时,您也将决定(并非总是情愿或有意识地)可以用来提供应用程序的服务器。这是由于缺乏一个被普遍接受的接口规范的存在:应用程序(框架)和 Web 服务器一样会适应并使用它来进行通信,从而允许在必要时以可能的零代码更改进行组件的互换。
在本世纪初,人们努力解决这个问题,并向社区提出了 Python 增强提案(PEP)333。
来自 PEP(Python 增强提案)333:
本文档规定了 Web 服务器和 Python Web 应用程序或框架之间的一个提议的标准接口,以促进 Web 应用程序在各种 Web 服务器之间的可移植性。
正如 PEP 中所解释的那样,这个新标准旨在允许(和之间)[Web] 服务器和 [Python Web] 应用程序之间的可移植性。该标准强大的功能及其与以前的标准相比的广泛采用为今天铺平了道路:存在许多(也许太多)愿意为您完成工作的 Web 服务器的世界。
在这个针对基于 Python 的 Web 应用程序的 Web 服务器比较中,我们将讨论一些可用的选择以及它们的特点。这里的目的是让读者有一个更清晰的视野,并提供帮助来匹配服务器与应用程序的定制需求,以找到最佳选择。由于选项的数量庞大(每天都有更多的选项出现!),我们将通过过滤并讨论那些在各种方面都“特别”的选项:受欢迎程度、稳定性,或者与其他选项相比做一些不同(或更好)的事情。
**注意:**我想建议您,读者,对于那些倾向于不反映真实生产环境条件的有偏见和欺骗性的基准测试要保持警惕。不幸的是,当选择用于生产的 Web 服务器时,这些[文章]在很大程度上并不重要,因为这也极不可能是导致瓶颈的部分。因此,建议您评估和了解自己的需求,然后尝试不同的选项,避免根据推测的数字来避免真正的未来灾难场景。
它是什么?
CherryPy 实际上是一个 Web 框架。但它是一个完全独立的框架——这意味着它可以独立运行,包括在生产场景中,而无需额外的软件。这得益于其自己的 WSGI、符合 HTTP/1.1 的 Web 服务器。CherryPy 项目将其描述为“一个高速、生产就绪、线程池化的通用 HTTP 服务器”。由于它是一个 WSGI 服务器,它也可以用于提供任何其他 WSGI Python 应用程序,而不仅仅是绑定到 CherryPy 的应用程序开发框架。
为什么应该考虑使用它?
它是什么?
Gunicorn 是一个独立的 Web 服务器,以相当简单的方式提供了相当多的功能。它使用预分叉模型——这意味着一个中央主进程(Gunicorn)负责管理启动的工作进程(不同类型的),然后直接处理和处理请求。所有这些都可以配置和适应您的需求和不同的生产场景。
为什么应该考虑使用它?
它是什么?
Tornado 是一个应用程序开发框架和网络库,专为处理异步操作而设计,允许服务器维护大量的开放连接。它还配备了一个 WSGI 服务器,其他 WSGI Python 应用程序(和框架)可以使用它来运行。
为什么应该考虑使用它?
尽管在这些情况下你可能希望选择 Tornado 的 WSGI 服务器来进行项目开发,你也可以选择使用带有 Tornado [异步] 工作进程的 Gunicorn。
它是什么?
Twisted Web 是随 Twisted 网络库提供的 Web 服务器。而 Twisted 本身是“一个事件驱动的网络引擎”,Twisted Web 服务器运行在 WSGI 上,能够为其他 Python Web 应用程序提供动力。
为什么应该考虑使用它?
Python Scrips (.rpy)
,它提供了简单且快速的原型设计能力,这些脚本在 HTTP 请求时执行。它是什么?
尽管其命名规范非常令人困惑,uWSGI 本身是一个庞大的项目,具有许多组件,旨在为“构建托管服务”提供“完整的[软件]堆栈”。其中一个组件,uWSGI 服务器,运行 Python WSGI 应用程序。它能够使用各种协议,包括其自己的 uwsgi 传输协议,几乎与 SCGI 相同。为了满足使用独立的 HTTP 服务器作为应用服务器前端的(可以理解的)需求,NGINX 和 Cherokee Web 服务器被模块化以支持 uWSGI 的(性能最佳的) uwsgi 协议,以直接控制其进程。
为什么应该考虑使用它?
它是什么?
Waitress 是一个纯 Python WSGI 服务器。乍一看,它可能与许多其他服务器没有太大区别;然而,它的开发理念使其与众不同。它的目标是为 Python Web 应用程序开发人员减轻由 Web 服务器引起的生产(和开发)负担。Waitress 通过中和由平台(例如 Unix vs. Windows)、解释器(CPython vs. PyPy)和 Python(版本 2 vs. 3)差异引起的问题来实现这一目标。
为什么应该考虑使用它?
带有 WSGI 适配器的 mod_python(Apache)(嵌入 Python)
它是什么?
简而言之,mod_python 是将 Python 嵌入服务器本身的 Apache 模块。尽管出于各种原因不建议使用(项目已经停止并过时,只有最近原始作者有意继续开发),它可以通过包装器在 Apache 上运行 WSGI 应用程序。
为什么应该考虑使用它?
你可能希望出于特定原因使用 Python 编程和扩展 Apache。
mod_wsgi(Apache)(嵌入 Python)
它是什么?
作为一个符合 WSGI 的模块,mod_wsgi 允许你在 Apache HTTP 服务器上运行 Python WSGI 应用程序。它通过两种方式实现这一点:第一种方式类似于 mod_python 的工作方式,通过将代码嵌入并在子进程中执行。另一种方法提供了基于守护程序的操作模式,其中 WSGI 应用程序有自己独特的进程,由 mod_wsgi 自动管理。
为什么应该考虑使用它?