uWSGI其一:概念篇

对 Nginx,WSGI(或者 uWSGI,uwsgi),Django(或者Flash或Tornado),这几者的关系一存存在疑惑。通过查阅了些资料,总算把它们的关系理清了。

总括来说,客户端从发送一个 HTTP 请求到Django处理请求,分别经过了 web服务器层,WSGI层,web框架层,这三个层次。不同的层次其作用也不同,下面简要介绍各层的作用。

图1:web服务器,web框架与 WSGI 的三层关系

Web服务器层

对于传统的客户端 – 服务器架构,其请求的处理过程是,客户端向服务器发送请求,服务器接收请求并处理请求,然后给客户端返回响应。在这个过程中,服务器的作用是:

  1. 接收请求
  2. 处理请求
  3. 返回响应

Web服务器是一类特殊的服务器,其作用是主要是接收 HTTP 请求并返回响应。提起 web服务器大家都不会陌生,常见的web服务器有 Nginx,Apache,IIS等。在上图1的三层结构中,web服务器是最先接收用户请求的,并将响应结果返回给用户。

Web框架层

Web框架的作用主要是方便我们开发web应用程序,HTTP请求的动态数据就是由 web框架层来提供的。常见的web框架有Django,Flask等,我们以Flask框架为例子,展示web框架的作用:

from flask import Flask
app = Flask(__name__)

@app.route(‘/hello‘)
def hello_world():
    return ‘Hello World!‘

if __name__ == ‘__main__‘:
    app.run(host=‘0.0.0.0‘, port=8080)

以上简单的几行代码,就创建了一个 web应用程序对象appapp监听机器的8080端口,接受用户的请求连接。我们知道,HTTP 协议使用 URL 来定位资源,上面的程序会将路径 /hello 的请求交由 hello_world 方法处理,hello_world 返回 ‘Hello World!’ 字符串。对于 web框架的使用者来说,他们并不关心如何接收 HTTP 请求,也不关心如何将请求路由到具体方法处理并将响应结果返回给用户。Web框架的使用者在大部分情况下,只需要关心如何实现业务的逻辑即可。

WSGI层

WSGI不是服务器,也不是用于与程序交互的API,更不是真实的代码,WSGI只是一种接口,它只适用于Python语言,其全称为Web Server Gateway Interface,定义了web服务器和web应用之间的接口规范。也就是说,只要web服务器和web应用都遵守WSGI协议,那么web服务器和 web应用就可以随意的组合。

下面的代码展示了web服务器是如何与 web应用组合在一起的。

def application(env, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
    return [b"Hello World"]

方法application由web服务器调用,参数envstart_response 由 web服务器实现并传入。其中,env是一个字典,包含了类似 HTTP_HOST,HOST_USER_AGENT,SERVER_PROTOCO 等环境变量。start_response则是一个方法,该方法接受两个参数,分别是statusresponse_headersapplication方法的主要作用是,设置 http 响应的状态码和 Content-Type 等头部信息,并返回响应的具体结果。

上述代码就是一个完整的WSGI应用,当一个支持WSGI的web服务器接收到客户端的请求后,便会调用这个application方法。WSGI层并不需要关心envstart_response 这两个变量是如何实现的,就像在application里面所做的,直接使用这两个变量即可。

值得指出的是,WSGI是一种协议,需要区分几个相近的名词:

  • uwsgi

    同wsgi一样也是一种协议,uWSGI服务器正是使用了 uwsgi 协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

  • uWSGI

    实现了uwsgi和WSGI两种协议的web服务器。注意uWSGI本质上也是一种 web服务器,处于上面描述的三层结构中的web服务器层。

  • CGI

    通用网关接口,并不限于Python语言,定义了web服务器是如何向客户端提供动态的内容。例如,规定了客户端如何将参数传递给 web服务器,web服务器如何将参数传递给 web应用,web应用如何将它的输出如何发送给客户端,等等。

    生产环境下的 web应用都不使用CGI了,CGI进程(类似Python解释器)针对每个请求创建,用完就抛弃,效率低下。WSGI正是为了替代CGI而出现的。

  • 为什么有了uWSGI为什么还需要nginx?因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。

说到这,我们基本理清了WSGI 在web服务器与web框架之间作用:WSGI 就像一条纽带,将web服务器与web框架连接起来。回到本文的题目,Nginx属于一种web服务器,Django属于一种 web框架,因此,WSGI 与
Nginx、Django的作用就不明而喻了。

最后以 Nginx,WSGI,Django之间的对话结束本文。

Nginx:Hey,WSGI,我刚收到了一个请求,我需要你作些准备,然后由Django来处理这个请求。

WSGI:OK,Nginx。我会设置好环境变量,然后将这个请求传递给Flask处理。

Django:Thanks WSGI!给我一些时间,我将会把请求的响应返回给你。

WSGI:Alright,那我等你。

Django:Okay,我完成了,这里是请求的响应结果,请求把结果传递给Nginx。

WSGI:Good job!Nginx,这里是响应结果,已经按照要求给你传递回来了。

Nginx:Cool,我收到了,我把响应结果返回给客户端。大家合作愉快~

WSGI 就像一条纽带,将 web服务器与 web框架连接起来,那Nginx和Python项目之间能否不通过WSGI来实现?

答案是可以的。比如 Django或Tornado就可以通过自己的web_server跑起来,无需实现 wsgi。wsgi 只是个接口协议,用来将 nginx 传过来的http请求转化成 Python 容易解析的格式。所以只要自己实现http请求的解析就行。另外 nginx 只是做反向代理用,不用nginx,你也可以直接跑python web server暴露端口来供外网访问,只是这样静态文件请求也只能 python web server自己处理了。

时间: 2024-08-08 09:42:42

uWSGI其一:概念篇的相关文章

缓存服务器varnish概念篇

一.Varnish 简介 Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好. Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多.在1975年时,储存媒介只有两种:内存与硬盘.但现在计算机系统的内存除了主存外,还包括了CPU内的L1.L2,甚至有L3快取.硬盘上也有自己的快取装置,因此Squid Cac

使用GNS3和Cisco IOU搭建路由交换实验-概念篇

使用GNS3和Cisco IOU搭建路由交换实验-概念篇 说到模拟器,大家一定不会陌生,如大家所熟悉的Hyper-v.VMware和VirtualBox操作系统模拟器(虚拟机)还有常用在Unix和Linux下面的QEMU等模拟器,这些都是面向操作系统为对象的模拟器.另外还有面向街机为对象的街机游戏模拟器.面向网络设备或者网络操作系统为对象的网络模拟器就是我今天要给大家分享的主要对象! 所谓网络模拟器,就是利用计算机软件模拟网络设备实现类似于真实环境的网络设备的互联和配置的软件模拟平台!目前比较流

数据集成之主数据管理(一)基础概念篇

数据集成是当下比較热门的话题,相关的产品和平台也越来越多.非常多CIO都在各种数据集成平台和产品之间犹豫不决.因此对数据集成平台的框架体系有全面的理解,对各个厂家产品所提供的功能有深入的认识才干为数据平台选型的决策提供可靠的保证. 我有幸參与了国内一个知名企业的集成平台的设计工作,并主导了数据集成平台的需求分析和产品选型工作.这次工作中,研究了非常多新的技术方向和产品,以下我主要讲一下数据集成领域的一种新兴的产品平台主数据管理平台MDM(Master Data Management). 主数据的

软考之路(五)---编译原理 概念篇

从组成原理到编译原理,都是相互联系的,学习的知识都是在层层推进,顺利成章的,整个软考的所有的知识都可以从计算机的发展(组成原理)--->软件的开发(软件工程)--->软件的算法设计(数据结构)-->高级语言写的系统--->在计算机上识别(编译原理)--->各个系统的背后数据的支持--->(数据库)---->---网络知识的应用---->网络基础--,可以把整个所有的软考的课本给串起来,这些都是构成现在丰富世界的必不可少的条件. 当然由于机器语言由0.1组成,

【黑金原创教程】 FPGA那些事儿 — 概念篇

前言: 建 模久了,笔者总觉得自己还缺少一种可以从低层(Low Level),至系统层(System Level)再到抽象层(High Level)等贯穿一切的建模技巧.如此执念,间接造就低级建模II的诞生.低级建模II是什么?它是一种建模倾向,也是一种建模技巧.这本<概念篇>是 它的使用手册,内容讲述了相关思想还有方法. <概 念篇>是一本脑洞澎湃的大杂烩,然而点燃这窝猪汤其实是一份情绪.有人经常在笔者耳边洗·脑,说生活就是赚钱买车买楼娶老婆,鬼叫笔者不知道吗?但是人生 赢家不可

高性能缓存加速器varnish(概念篇)

高性能缓存加速器varnish(概念篇) 一.varnish简介 varnish是一款高性能的开源HTTP加速器,现在很多门户网站已经部署了varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源暂用更少. 作者Poul-Henning Kamp是FreeBSD的内核开发者之一.Varnish采用全新的软件体系架构,和现在的硬件提交配合紧密.在1975年时,储存媒介只有两种:内存与硬盘.但现在计算 机系统的内存除了主存外,还包括了cpu内的L1.L2,甚至有L3快取.硬盘上也

ETL学习笔记之概念篇

导读:ETL,Extraction-Transformation-Loading的缩写,即数据抽取(Extract).转换(Transform).装载(Load)的过程,它是构建数据仓库的重要环节. 关键词:ETL 数据仓库 OLTP OLAP ETL,Extraction-Transformation-Loading的缩写,即数据抽取(Extract).转换(Transform).装载(Load)的过程,它是构建数据仓库的重要环节. ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库

红帽集群套件RHCS四部曲(概念篇)

红帽集群套件RHCS四部曲(概念篇)一. 什么是RHCSRHCS是Red Hat Cluster Suite的缩写,也就是红帽子集群套件,RHCS是一个能够提供高可用性.高可靠性.负载均衡.存储共享且经济廉价的集群工具集合,它将集群系统中三大集群架构融合一体,可以给web应用.数据库应用等提供安全.稳定的运行环境.更确切的说,RHCS是一个功能完备的集群应用解决方案,它从应用的前端访问到后端的数据存储都提供了一个行之有效的集群架构实现,通过RHCS提供的这种解决方案,不但能保证前端应用持久.稳定

Entity Framework 4.1/4.3 之一 (概念篇)

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 Entity Framework 4.1/4.3 之一 (概念篇) 前序: 大家好,我都想死你们了.因为我想写个Entity Framework 系列的文章,所以在之一这里我写了下前序,一方面讲一下我写系列文章的出发点,二方面讲一下写的思路.很

台湾最佳医院信息化及管理实践-个案管理师之概念篇

曾志仁原著,袁永福编辑整理 前言 很荣幸能向各位医疗行业的同仁介绍台湾医院的一些管理经验和实践.客观的讲,台湾更好的继承和保留了中华民族传统文化,同时台湾深受美国和日本的影响,这样台湾文化是中西方文化的结合,这使得台湾的医院管理也很有特色,有很多经验值得大陆医疗行业学习和借鉴的. 笔者有幸结识台湾台中的中山大学附属医院曾志仁医师,他本身是一个医术精湛的妇科癌症专科医生,同时对医院信息化和医院管理的造诣也很深,是比较少见的跨界高手.对于医院管理有着成套的理解和实践,本系列文章所包含的知识产权大部分