资讯专栏INFORMATION COLUMN

如何理解Nginx, WSGI, Flask之间的关系

魏明 / 1890人阅读

摘要:通过查阅了些资料,总算把它们的关系理清了。在这个过程中,服务器的作用是接收请求处理请求返回响应服务器是一类特殊的服务器,其作用是主要是接收请求并返回响应。正是为了替代而出现的。三结语最后以,,之间的对话结束本文。

刚转行互联网行业,听到了许多名词:Flask、Django、WSGI、 Nginx、Apache等等,一直无法搞清楚这些开源项目之间的关系,直至看到这篇文章后感觉醍醐灌顶,以下是转载的部分,感谢haozlee分享出这篇文章!


一、概览

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

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


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

二、 各层作用

1、Web服务器层

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

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

2、Web框架层

Web框架的作用主要是方便我们开发 web应用程序,HTTP请求的动态数据就是由 web框架层来提供的。常见的 web框架有Flask,Django等,我们以 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应用程序对象 app。app 监听机器所有 ip 的 8080 端口,接受用户的请求连接。我们知道,HTTP 协议使用 URL 来定位资源,上面的程序会将路径 /hello 的请求交由 hello_world 方法处理,hello_world 返回 ‘Hello World!’ 字符串。对于 web框架的使用者来说,他们并不关心如何接收 HTTP 请求,也不关心如何将请求路由到具体方法处理并将响应结果返回给用户。Web框架的使用者在大部分情况下,只需要关心如何实现业务的逻辑即可。

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

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

值得指出的是,WSGI 是一种协议,需要区分几个相近的名词:
(1)、uwsgi
同 wsgi 一样也是一种协议,uWSGI服务器正是使用了 uwsgi 协议
(2)、uWSGI
实现了 uwsgi 和 WSGI 两种协议的web服务器。注意 uWSGI 本质上也是一种 web服务器,处于上面描述的三层结构中的 web服务器层。
(3)、CGI
通用网关接口,并不限于 Python 语言,定义了 web服务器是如何向客户端提供动态的内容。例如,规定了客户端如何将参数传递给 web服务器,web服务器如何将参数传递给 web应用,web应用如何将它的输出如何发送给客户端,等等。

生产环境下的 web应用都不使用 CGI 了,CGI进程(类似 Python 解释器)针对每个请求创建,用完就抛弃,效率低下。WSGI 正是为了替代 CGI 而出现的。
说到这,我们基本理清了 WSGI 在 web服务器与 web框架之间作用:WSGI 就像一条纽带,将 web服务器与 web框架连接起来。回到本文的题目,Nginx 属于一种 web服务器,Flask属于一种 web框架,因此,WSGI 与 Nginx、Flask 的作用就不明而喻了。

三、结语

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

Nginx:Hey,WSGI,我刚收到了一个请求,我需要你作些准备,然后由Flask来处理这个请求。
WSGI:OK,Nginx。我会设置好环境变量,然后将这个请求传递给Flask处理。
Flask:Thanks WSGI!给我一些时间,我将会把请求的响应返回给你。
WSGI:Alright,那我等你。
Flask:Okay,我完成了,这里是请求的响应结果,请求把结果传递给Nginx。
WSGI:Good job!Nginx,这里是响应结果,已经按照要求给你传递回来了。
Nginx:Cool,我收到了,我把响应结果返回给客户端。大家合作愉快~

四、参考资料

(1)、http://hackerxu.com/2015/05/1...
(2)、https://www.quora.com/What-ar...
(3)、https://en.wikipedia.org/wiki...
(4)、http://flask.pocoo.org/docs/0...
(5)、http://stackoverflow.com/ques...
(6)、https://www.python.org/dev/pe...
(7)、《Python核心编程(第3版)》Wesley Chun著

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39867.html

相关文章

  • flask route设计思路

    摘要:引言本文主要梳理了源码中的设计思路。协议将处理请求的组件按照功能及调用关系分成了三种。不论是什么,最终都会调用函数。 引言 本文主要梳理了flask源码中route的设计思路。首先,从WSGI协议的角度介绍flask route的作用;其次,详细讲解如何借助werkzeug库的Map、Rule实现route;最后,梳理了一次完整的http请求中route的完整流程。 flask rou...

    vvpale 评论0 收藏0
  • 深入理解flask框架(1):WSGI与路由

    摘要:是一个小而美的微框架,主要依赖于和,只建立和的桥梁,前者实现一个合适的应用,后者处理模板。本文主要分析了是在基础上如何构建接口与路由系统的。网关协议的本质是为了解耦,实现服务器和应用程序的分离,就是一个支持的服务器与应用程序之间的约定。 flask是一个小而美的微框架,主要依赖于Werkezug 和 Jinja2, Flask 只建立 Werkezug 和 Jinja2 的桥梁,前者实...

    xiaolinbang 评论0 收藏0
  • Werkzeug 与 WSGI 介绍

    摘要:在介绍之前,先介绍一下,它为语言定义的服务器和应用程序或框架之间的一种简单而通用的接口。这个函数接受两个参数,分别是和。响应对象是一个应用,提供了更好的方法来创建响应。这部分解释来源于官方文档的中文版。 Werkzeug 是一个WSGI工具包,也可以作为一个Web框架的底层库。 WSGI 在介绍Werkzeug之前,先介绍一下 WSGI(Python Web Server Gate...

    mengera88 评论0 收藏0
  • flask 源码解析:简介

    摘要:简介官网上对它的定位是一个微开发框架。另外一个必须理解的概念是,简单来说就是一套和框架应用之间的协议。功能比较丰富,支持解析自动防止攻击继承变量过滤器流程逻辑支持代码逻辑集成等等。那么,从下一篇文章,我们就正式开始源码之旅了 文章属于作者原创,原文发布在个人博客。 flask 简介 Flask 官网上对它的定位是一个微 python web 开发框架。 Flask is a micro...

    megatron 评论0 收藏0

发表评论

0条评论

魏明

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<