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

简介


在本文中,我们将讨论三个主要内容:Python、Web 服务器,以及两者之间最重要的细节。

开玩笑的话,这篇相当长的文章对于一些寻求快速指导或答案的人来说可能看起来有些严肃。不幸的是,与 Python 世界中的大多数事物不同的是,当选择一个用于部署应用程序的生产服务器堆栈时,并没有一种——最好只有一种——明显的方法。

然而,这不应该吓到你。完成本文后,您将对不同的 Web 服务器如何工作以及如何处理与基于 Python 的 Web 应用程序交互的任务有很好的了解。在评估您的需求和要求后,您将能够决定使用哪个服务器。

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


理解问题


如今,存在着越来越多专门设计(或适应)与 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 服务器时,这些[文章]在很大程度上并不重要,因为这也极不可能是导致瓶颈的部分。因此,建议您评估和了解自己的需求,然后尝试不同的选项,避免根据推测的数字来避免真正的未来灾难场景。

Web 服务器(按字母顺序)


CherryPy WSGI 服务器


它是什么?

CherryPy 实际上是一个 Web 框架。但它是一个完全独立的框架——这意味着它可以独立运行,包括在生产场景中,而无需额外的软件。这得益于其自己的 WSGI、符合 HTTP/1.1 的 Web 服务器。CherryPy 项目将其描述为“一个高速、生产就绪、线程池化的通用 HTTP 服务器”。由于它是一个 WSGI 服务器,它也可以用于提供任何其他 WSGI Python 应用程序,而不仅仅是绑定到 CherryPy 的应用程序开发框架。

为什么应该考虑使用它?

  • 它紧凑且简单。
  • 它可以为运行在 WSGI 上的任何 Python Web 应用程序提供服务。
  • 它可以处理静态文件,也可以仅用于提供文件和文件夹。
  • 它是线程池化的。
  • 它支持 SSL。
  • 它是一个易于适应、易于使用的纯 Python 替代方案,稳健可靠。

Gunicorn

它是什么?

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

为什么应该考虑使用它?

  • 它支持 WSGI,并且可以与任何运行 WSGI 的 Python 应用程序和框架一起使用。
  • 它也可以用作 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 服务器来进行项目开发,你也可以选择使用带有 Tornado [异步] 工作进程的 Gunicorn。

Twisted Web


它是什么?

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

为什么应该考虑使用它?

  • 它易于使用,稳定且成熟。
  • 它可以运行 WSGI Python 应用程序。
  • 它可以像 Python Web 服务器框架一样运行,允许你使用语言进行自定义 HTTP 服务编程。
  • 通过 Python Scrips (.rpy),它提供了简单且快速的原型设计能力,这些脚本在 HTTP 请求时执行。
  • 它具有代理和反向代理功能。
  • 它支持虚拟主机。
  • 甚至可以通过 twisted.web.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 Web 服务器(以及 Cherokee* 和 lighttpd)。
  • 它是用 C 编写的。
  • 其各种组件可以做的远不止运行应用程序,这对于扩展可能会很方便。
  • 目前(截至2013年末),它正在积极开发,并具有快速的发布周期。
  • 它具有多种引擎来运行应用程序(异步和同步)。
  • 运行时可能意味着更低的内存占用。

Waitress WSGI 服务器


它是什么?

Waitress 是一个纯 Python WSGI 服务器。乍一看,它可能与许多其他服务器没有太大区别;然而,它的开发理念使其与众不同。它的目标是为 Python Web 应用程序开发人员减轻由 Web 服务器引起的生产(和开发)负担。Waitress 通过中和由平台(例如 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 适配器的 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 自动管理。

为什么应该考虑使用它?

  • 与 Apache 的现有经验可以意味着在运行 Python 时为你的操作提供稳定的生产环境。这一点单独就足以挽救一天,使其值得。
  • 如果你依赖于 Apache 或想利用其稳定且丰富的扩展模块,这将是一个不错的选择。
  • 它可以在不同的系统用户下运行应用程序,以进一步提高安全性。
  • 它是一个经过验证的、可靠的软件。
  • 万维网包含与之相关的大量信息和问答,这可以在遇到真正的生产问题时为你节省大量时间。
  • 它还具有 Apache 提供的所有其他功能。
提交者: O.S. Tezer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

153基于matlab的滚动轴承故障诊断

基于matlab的滚动轴承故障诊断,基于小波包分解,得到数据峭度值,以正常与故障数据峭度差值进行最大尺度重构,对重构信号进行包络谱分析。程序已调通,可直接运行。 153matlab 信号重构 包络谱分析 故障诊断 (xiaohongshu…

工业物联网接入网关在制造企业的实际应用-天拓四方

随着工业4.0和智能制造的兴起,工业物联网(IIoT)已成为工厂自动化的关键驱动力。在这个转变中,工业物联网网关扮演着至关重要的角色。它们充当了设备与企业系统之间的桥梁,实现了数据采集、分析和设备控制等功能。 案例…

ServletConfig类和ServletContext类

1.ServletConfig类 1什么是ServletConfig? ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类 。 Servlet 程序默认是第一次访问的时候创建, ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 S…

编程笔记 html5cssjs 076 Javascript 表达式

编程笔记 html5&css&js 076 Javascript 表达式 一、JavaScript表达式二、示例总结 在JavaScript中,表达式是一种可以计算出值的结构。它可以是一个简单的字面量(如数字或字符串),一个变量名,或者更复杂的结构&…

Python3 交叉编译 numpy pandas scipy scikit-learn

1. 概述 由于需要将Python3.7 和一些软件包交叉编译到 armv7 平台硬件,如果是arm64位的系统,很多包都有预编译好的版本,可直接下载。本文主要在基于 crossenv(https://github.com/benfogle/crossenv)环境下交叉编译。 2. 编译环境搭建 创建…

Node.js-1

Node.js 简介 定义:Node.js 是一个跨平台 JavaScript 运行环境,使开发者可以搭建服务器端的 JavaScript 应用程序 为什么 Node.js 能执行 JS 代码: Chrome 浏览器能执行 JS 代码,依靠的是内核中的 V8引擎(即&#x…

2024PMP考试新考纲-近年真题练一练和很详细解析(1)

前面的几十篇文章中,华研荟主要从PMP相关的教材(PMBOK第六版、PMBOK第七版和敏捷实践指南》出发,分类介绍了相关的考试真题,并逐一作了比较详细的解析,部分典型题目还做了提醒和拓展,帮助大家做题的时候知其…

Leetcode的AC指南 —— 栈与队列 :1047.删除字符串中的所有相邻重复项

摘要: **Leetcode的AC指南 —— 栈与队列 :1047.删除字符串中的所有相邻重复项 **。题目介绍:给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作&a…

面试常问的-React 18的新特性

2022年3月发布的React 18带来了一系列新特性和更新,极大地增强了React应用程序的功能和性能。这个版本为并发渲染奠定了基础,这是React未来更新的基石。下面我们来深入了解React 18的关键特性和变化,包括技术细节和代码示例。 升级到React 18 要开始使用React 18,请使用npm或…

MATLAB计算多边形质心/矩心

前言:不规则四边形的中心 不规则四边形的出心有多种定义,以下是最常见的三种: 1.重心:重心是四边形内部所有顶点连线交点的平均位置。可以通过求解四个顶点坐标的平均值来找到重心。 2.质心:质心是四边形内部所有质点…

242. Valid Anagram(有效的字母异位词)

问题描述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 问题分析 此问题与383. Ransom Note(赎金信)类似,只是字符变为了…

Python入门指北二十三

Python中有哪些常用的ORM框架?它们的特点是什么? Python中有多个常用的ORM框架,每个框架都有其独特的特点和适用场景。以下是其中几个常用的ORM框架: SQLAlchemy:SQLAlchemy是Python中一个非常流行的ORM框架&#xf…

Qt多语言翻译

Qt多语言翻译概述 Qt提供了非常简单易用的多语言翻译机制,其核心类为QTranslator.概括来说就是利用Qt的lupdate工具将项目中所有tr函数包裹的字符串提取到.ts文件中,然后使用Qt Linguist由专门的翻译人员对提取的.ts文件进行逐个单词短语的翻译工作. 翻译…

Qt中的线程与信号槽

小实践 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H // #pragma once #include <QMainWindow> #include"zthread.h"QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass ZThread;class MainWindow : public QMainWin…

docker入门教程之将应用程序容器化

将应用程序容器化 在本指南的其余部分中&#xff0c;您将使用在 Node.js 上运行的简单待办事项列表管理器。如果您不熟悉 Node.js&#xff0c;请不要担心。本指南不需要任何 JavaScript 经验。 先决条件 您已安装最新版本的 Docker Desktop。您已经安装了 Git 客户端。您可以…

突破编程_C++_基础教程(指针(一))

1 指针的基础概念 指针是 C 的核心之一&#xff0c;使用 C 语言构建的程序之所以性能强悍&#xff0c;有很大部分原因是体现在使用指针直接操作内存。当然这样的工具是一把双刃剑&#xff0c;错误的指针操作可能会导致程序崩溃或者数据损坏。 指针主要有四个方面的用途&#x…

java05 数组

一 概念介绍 指的是一种容器&#xff0c;可以同来存储同种数据类型的多个值。 但是数组容器在存储数据的时候&#xff0c;需要结合隐式转换考虑。 比如&#xff1a; 定义了一个int类型的数组。那么boolean。double类型的数据是不能存到这个数组中的&#xff0c; 但是byte类…

Java线程同步的方法和例子

在Java中&#xff0c;线程同步是一种机制&#xff0c;用于确保多个线程可以安全地访问共享资源&#xff0c;而不会发生数据不一致或数据损坏的情况。线程同步的主要方法包括&#xff1a; synchronized关键字&#xff1a;这是Java中最常用的线程同步方法。它用于方法或代码块&a…

Orange3数据预处理(分组组件)

Group By是Orange3中一个非常有用的组件&#xff0c;它允许用户对数据集进行聚合操作&#xff0c;类似于SQL中的GROUP BY语句或Pandas库中的groupby方法。以下是Group By组件的一些核心功能介绍&#xff1a; 1. Mean (平均数): 数据值的总和除以数据项的数量&#xff0c;显示数…

Megatron-LM源码系列(七):Distributed-Optimizer分布式优化器实现Part2

1. 使用入口 DistributedOptimizer类定义在megatron/optimizer/distrib_optimizer.py文件中。创建的入口是在megatron/optimizer/__init__.py文件中的get_megatron_optimizer函数中。根据传入的args.use_distributed_optimizer参数来判断是用DistributedOptimizer还是Float16O…