基于Python的Web应用程序的Web服务器比较
介绍
在本文中,我们将讨论三个主要内容:Python、Web 服务器,以及最重要的介于两者之间的东西。
除了笑话,这篇相当长的文章对于一些寻求快速指导或答案的人来说可能看起来很可怕。 不幸的是,与 Python 世界中的大多数事情不同,在选择生产服务器堆栈来部署您的应用程序时,没有 一种——最好只有一种——明显的方法来做到这一点。
但是,这不应该吓到你。 完成本文后,您将对不同的 Web 服务器如何工作以及处理与基于 Python 的 Web 应用程序对话的任务有很好的了解。 在衡量您的需求和要求后,您将能够决定使用哪个服务器。
Python Web 服务器网关接口 v1.0 (WSGI)
了解问题
今天,有越来越多的 Web 服务器(或服务器模块)专门设计(或改编)以可互换地与 Python Web 应用程序一起工作。 然而,情况并非总是如此。 在过去,开发人员并没有真正可以随意切换 Web 服务器的可能性,并且由于依赖关系和限制,每次切换都会产生成本。 在决定要构建的框架时,您也会(并非总是自愿或有意识地)决定您也可以用来为应用程序提供服务的服务器。 这是由于缺乏普遍接受的 接口规范 :应用程序(框架)和 Web 服务器等将适应和使用来通信的共同基础,允许在必要时使用可能的零代码互换组件改变。
标准的诞生
本世纪初,通过向社区提交 Python 增强提案 (PEP) 333 最终解决了这个问题。
This document specifies a proposed standard interface between web servers and Python web applications or frameworks, to promote web application portability across a variety of web servers.
正如 PEP 中所解释的,这个新标准曾经(并且现在)旨在允许跨(和之间)[web] 服务器和 [Python web] 应用程序的可移植性。 与以前的标准相比,该标准的强大功能及其广泛采用引领了今天:一个存在许多(也许太多)愿意为您完成工作的 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(例如:Pyramid)、Django 的开发服务器、web2py 等的替代品。
- 提供各种工作器类型/配置和自动工作器进程管理的选择。
- 通过同步和异步工作器支持 HTTP/1.0 和 HTTP/1.1 (Keep-Alive)。
- 附带 SSL 支持
- 可通过钩子扩展。
- 它是透明的并且具有清晰的架构。
- 支持 Python 版本 2.6、2.7、3、3.2、3.3
Tornado(通过 wsgi.WSGIContainer 的 HTTP 服务器)
它是什么?
Tornado 是一个应用程序开发框架和网络库,旨在处理异步操作,允许服务器维护大量打开的连接。 它还带有一个 WSGI 服务器,其他 WSGI Python 应用程序(和框架)可以使用它来运行。
为什么要考虑使用它?
- 如果您正在构建顶级 Tornado 框架; 或者
- 您的应用程序需要异步功能。
尽管在这些情况下您可能希望为您的项目选择 Tornado 的 WSGI 服务器,但您也可以选择将 Gunicorn 与 Tornado [异步] 工作程序一起使用。
扭曲的网络
它是什么?
Twisted Web 是 Twisted 网络库附带的 Web 服务器。 Twisted 本身是“事件驱动的网络引擎”,而 Twisted Web 服务器在 WSGI 上运行,它能够为其他 Python Web 应用程序提供动力。
为什么要考虑使用它?
- 是一款使用简单、稳定、成熟的产品。
- 它将运行 WSGI Python 应用程序。
- 它可以像 Python Web 服务器框架一样运行,允许您使用该语言对其进行编程以实现自定义 HTTP 服务目的。
- 它通过根据 HTTP 请求执行的
Python Scrips (.rpy)
提供简单快速的原型设计能力。 - 它带有代理和反向代理功能。
- 它支持虚拟主机。
- 它甚至可以通过 twisted.web.twcgi API 为 Perl、PHP 等提供服务。
uWSGI
它是什么?
尽管 非常 令人困惑的命名约定,uWSGI 本身是一个包含许多组件的庞大项目,旨在为 building hosting services
提供 full [software] stack
。 这些组件之一,uWSGI 服务器,运行 Python WSGI 应用程序。 它能够使用各种协议,包括它自己的 uwsgi 有线协议,与 SCGI 准相同。 为了满足(可理解的)在应用程序服务器前使用独立 HTTP 服务器的需求,NGINX 和 Cherokee Web 服务器被模块化以支持 uWSGI(最佳性能)uwsgi[X214X ] 协议直接控制其进程。
为什么要考虑使用它?
- uWSGI 带有一个 WSGI 适配器,它完全支持在 WSGI 上运行的 Python 应用程序。
- 它与 libpython 链接。 它在启动时加载应用程序代码,并充当 Python 解释器。 它解析传入的请求并调用 Python 可调用对象。
- 它直接支持流行的 NGINX Web 服务器(以及 Cherokee* 和 lighttpd)。
- 它是用 C 编写的。
- 它的各种组件可以做的不仅仅是运行一个应用程序,这对于扩展来说可能很方便。
- 目前(截至 2013 年底),它正在积极开发并具有快速的发布周期。
- 它具有用于运行应用程序(异步和同步)的各种引擎。
- 这可能意味着运行时内存占用更少。
服务员 WSGI 服务器
它是什么?
Waitress 是一个纯 Python 的 WSGI 服务器。 乍一看,它似乎与许多其他产品并没有太大不同。 然而,它的开发理念将它与其他产品区分开来。 它的目的是减轻 Python Web 应用程序开发人员的 Web 服务器造成的生产(和开发)负担。 女服务员通过中和平台引起的问题来实现这一点(例如。 Unix 对比 Windows),解释器(CPython vs. PyPy)和 Python(第 2 版对比 3) 差异。
为什么要考虑使用它?
- 这是一个非常精简的纯 Python 解决方案。
- 它支持 HTTP/1.0 和 HTTP/1.1 (Keep-Alive)。
- 它已准备好部署到具有广泛平台支持的生产环境中。
- 与 CherryPy 不同,它实际上在本质上是独立于框架的。
- 它在 Windows 和 Unix 以及 CPython 解释器和 PyPy(仅限 Unix)上运行。
- 它支持 Python 版本 2 和 3。
独立服务器的模块
带有 WSGI 适配器 (Apache) 的 mod_python (嵌入 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 自动管理。
为什么要考虑使用它?
- 在运行 Python 时,现有的 Apache 经验可能意味着为您的操作提供稳定的生产环境。 仅此一项就可以节省一天,使其值得。
- 如果您依赖 Apache 或想利用其稳定且丰富的扩展模块,这将是您的最佳选择。
- 它可以在不同的系统用户下运行应用程序,以提高安全性。
- 这是一个久经考验的可靠软件。
- 万维网包含吨信息和与之相关的问答,当您遇到实际生产问题时,可以为您节省大量时间。
- 它带有 Apache 提供的所有其他功能。