深入解析Nginx、WSGI与Flask的协作机制

Hazel
Hazel
发布时间:2026-10-13| 2人浏览过
原创

本文详细梳理了Nginx、WSGI与Flask三层架构的工作关系。Nginx作为Web服务器接收HTTP请求,通过WSGI接口规范将请求传递给Flask框架处理业务逻辑,最后返回响应。文章解析了WSGI协议的作用,区分了WSGI、uWSGI与CGI的概念,并展示了代码实现与交互流程,帮助开发者理解Python Web应用的底层运行机制。

概览

此前,对于Nginx、WSGI(或uWSGI、uwsgi)以及Flask(或Django)之间的具体关系一直存在困惑。经过查阅相关资料,现在终于将这些概念及其相互联系梳理清晰。

总体而言,从客户端发送HTTP请求到Flask处理该请求,整个过程经历了Web服务器层、WSGI层和Web框架层这三个层级。不同层级承担着不同的职责,下文将对各层级的作用进行简要介绍。

Web服务器、Web框架与WSGI的三层关系

图1:Web服务器、Web框架与WSGI的三层关系

Web服务器层

在传统客户端-服务器架构中,请求处理流程为:客户端向服务器发送请求,服务器接收并处理该请求,随后向客户端返回响应。在此过程中,服务器的核心职责包括:

1 接收请求

2 处理请求

3 返回响应

Web服务器是一类特殊的服务器,其主要功能是接收HTTP请求并返回响应。大家熟知的Web服务器包括Nginx、Apache、IIS等。在图1所示的三层结构中,Web服务器位于最前端,负责接收用户请求并将最终响应结果返回给用户。

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)

上述简短代码创建了一个名为app的Web应用程序对象。app监听机器所有IP地址的8080端口,接受用户的请求连接。由于HTTP协议使用URL来定位资源,上述程序会将路径/hello的请求交由hello_world方法处理,该方法返回'Hello World!'字符串。对于Web框架的使用者而言,他们无需关心如何接收HTTP请求,也不必关注如何将请求路由到具体方法并返回响应结果。在大多数情况下,使用者只需专注于业务逻辑的实现即可。

WSGI层

WSGI并非服务器,也不是用于与程序交互的API,更不是具体的代码实现。WSGI全称为Web Server Gateway Interface(Web服务器网关接口),它定义了一种Web服务器与Web应用程序之间的接口规范。这意味着,只要Web服务器和Web应用都遵循WSGI协议,两者就可以自由组合。

以下代码展示了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是一种协议,因此需要区分几个相近的名词:

uwsgi

与WSGI类似,uwsgi也是一种协议,uWSGI服务器正是使用了uwsgi协议。

uWSGI

uWSGI是一个实现了uwsgi和WSGI两种协议的Web服务器。需要注意的是,uWSGI本质上仍属于Web服务器,处于上述三层结构中的Web服务器层。

CGI

通用网关接口(Common Gateway Interface),它不限于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:嘿,WSGI,我刚收到一个请求,需要你做些准备,然后由Flask来处理这个请求。

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

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

WSGI:好的,我等你。

Flask:好了,这是请求的响应结果,请将结果传递给Nginx。

WSGI:干得好!Nginx,这是响应结果,已按要求传递给你。

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

以上关于全面了解Nginx、WSGI、Flask之间关系的介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。