引言

在本文中,我们将讨论三个主要问题: Python、 Web 服务器,以及最重要的两者之间的位和边。

撇开玩笑不谈,对于那些寻求快速指导或答案的人来说,这篇相当长的文章似乎很可怕。 不幸的是,与 Python 世界中的大多数事情不同,在选择将应用程序部署到生产服务器堆栈时,没有一种(最好是唯一的)明显的方法可以做到这一点。

然而,这不应该吓到你。 在完成这篇文章之后,您将对不同的 web 服务器如何工作有很好的了解,并且能够处理与基于 Python 的 web 应用程序进行对话的任务。 在衡量您的需要和要求后,您将能够决定使用哪个服务器。

1.0(WSGI) Web服务器网关接口

理解问题

今天,有越来越多的 web 服务器(或服务器模块)专门设计(或适应)与 Python web 应用程序交替工作。 然而,情况并非总是如此。 在过去,开发人员不可能轻易地随意切换 web 服务器,而且由于依赖性和限制,每次切换都伴随着成本。 在决定构建一个框架之后,您可能也会决定(并非总是愿意或有意地)使用服务器来为应用程序提供服务。 这是因为缺乏一个普遍接受的接口规范: 一个应用程序(框架)和 web 服务器可以调整和使用的通信共同基础,允许在必要时互换组件,可能零代码更改。

标准的诞生

在本世纪初,通过向社区介绍 Python 增强提案(PEP)333,人们努力最终解决了这个问题。

来自 PEP (Python 增强提案)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 框架。 然而,它是一个完全自包含的软件,这意味着它可以自己运行,包括在不需要额外软件的生产场景中。 这要归功于它自己的 WSGI,http / 1.1兼容的 web 服务器。 Cherrypy 项目将其描述为“一个高速、可生产、线程池的通用 HTTP 服务器”。 因为它是一个 WSGI 服务器,所以它也可以用于服务任何其他 wsgipython 应用程序,而不必绑定到 CherryPy 的应用程序开发框架。

你为什么要考虑使用它呢?

  • 它简洁紧凑。
  • 它可以为运行在 WSGI 上的任何 Python web 应用程序提供服务。
  • 它可以处理静态文件,它可以只用于服务文件和文件夹。
  • 它是线程池的。
  • 它附带了对 SSL 的支持。
  • 它是一个易于调整、易于使用的纯 python 替代品,具有健壮性和可靠性。

鸟角兽属

这是什么?

Gunicorn 是一个独立的 web 服务器,它以显著易于操作的方式提供了相当多的功能。 它使用 pre-fork 模型——这意味着一个中央主进程(Gunicorn)负责管理已启动的工作进程(不同类型) ,然后这些工作进程直接处理和处理请求。 所有这些都可以配置和调整,以适应您的需求和不同的生产场景。

你为什么要考虑使用它呢?

  • 它支持 WSGI,可以与任何运行 Python 应用程序和框架的 WSGI 一起使用。
  • 它也可以作为 Paster (例如 Pyramid)、 Django 的 Development Server、 web2py 等的下载替代品。
  • 提供各种辅助类型 / 配置的选择和自动辅助进程管理。
  • Http / 1.0和 http / 1.1(Keep-Alive)通过同步和异步工作线程提供支持。
  • 附带 SSL 支持
  • 可扩展的钩子。
  • 它是透明的,有一个明确的架构。
  • 支持 Python 版本2.6,2.7,3,3.2,3.3

Tornado (HTTP Server via wsgi.WSGIContainer)

这是什么?

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

你为什么要考虑使用它呢?

  • 如果你是在龙卷风框架上构建的,或者
  • 您的应用程序需要异步功能。

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

扭曲的网络

这是什么?

Twisted Web 是 Twisted 网络库附带的 Web 服务器。 Twisted 本身是一个“事件驱动的网络引擎” ,而 Twisted Web 服务器运行在 WSGI 上,它能够为其他 Python Web 应用程序提供动力。

你为什么要考虑使用它呢?

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

Uwsgi

这是什么?

尽管 uWSGI 的命名约定非常混乱,但它本身是一个包含许多组件的庞大项目,旨在为构建托管服务提供完整的[软件]栈。 其中一个组件 uWSGI 服务器运行 Python WSGI 应用程序。 它能够使用各种协议,包括它自己的 uwsgi 线协议,该协议与 SCGI 类似。 为了满足在应用服务器前使用独立 HTTP 服务器的(可理解的)需求,NGINX 和 Cherokee web 服务器被模块化,以支持 uWSGI 的(性能最好的) uWSGI 协议,从而直接控制其进程。

你为什么要考虑使用它呢?

  • Uwsgi 带有一个 WSGI 适配器,它完全支持在 WSGI 上运行的 Python 应用程序。
  • 它与 libpython 相连接。 它在启动时加载应用程序代码,其作用类似于 Python 解释器。 它解析传入的请求并调用 Python 可调用的。
  • 它直接支持流行的 NGINX 网络服务器(包括 Cherokee * 和 lighttpd)。
  • 它是用 c 写的。
  • 它的各种组件可以做比运行应用程序更多的事情,这对于扩展可能很方便。
  • 目前(截至2013年年底) ,它正在积极开发,并有快速发布周期。
  • 它有各种运行应用程序的引擎(异步和同步)。
  • 这可能意味着运行时占用的内存更少。

服务器

这是什么?

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

你为什么要考虑使用它呢?

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

独立服务器模块

使用 WSGI 适配器(Apache)(嵌入 Python)改造 Python

这是什么?

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

你为什么要考虑使用它呢?

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

Mod wsgi (Apache)(嵌入 Python)

这是什么?

作为一个 WSGI 兼容模块,mod WSGI 允许你在 Apache HTTP Server 上运行 Python WSGI 应用程序。 它通过两种方式实现这一点: 第一种方式类似于 mod python 的工作方式,即在子进程中嵌入代码并执行代码。 另一个方法提供了一个基于守护进程的操作模式,WSGI 应用程序有自己独特的进程,由 mod WSGI 自动管理。

你为什么要考虑使用它呢?

  • 当涉及到运行 Python 时,使用 Apache 的现有经验可以为您的操作提供一个稳定的生产环境。 仅仅这一点就可以挽救这一天,让它变得值得。
  • 如果您依赖于 Apache,或者希望利用它的稳定和丰富的扩展模块,那么这将是正确的选择。
  • 为了进一步的安全性,它可以在不同的系统用户下运行应用程序。
  • 这是一个久经考验、可靠的软件。
  • 万维网包含了大量的信息和与之相关的问答,当你遇到真正的生产问题时,可以为你节省大量的时间。
  • 它还附带了 Apache 提供的所有其他功能。