WSGI / uwsgi / uWSGI

本文讲述了Web服务器、Web框架、WSGI协议以及uWSGI在PythonWeb开发中的作用,强调了uWSGI如何作为实现WSGI协议的服务器,以及与Nginx配合提供负载均衡和反向代理服务的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WSGI / uwsgi / uWSGI

在 Python Web 开发中,我们经常使用 Uwsgi 配合 Nginx 部署一个 Web 框架,如 Django 或 flask。同时我们又会说,框架和 Web 服务器之间要符合 WSGI 协议。

那就来厘清一下这几个概念。

Web 服务器和 Web框架

在讲 uWSGI 和 WSGI 之前,先要弄清楚 Web 开发的两大块,Web服务器和Web框架。

Web服务器即用来接受客户端请求,建立连接,转发响应的程序。至于转发的内容是什么,交由Web框架来处理,即处理这些业务逻辑。如查询数据库、生成实时信息等。Nginx就是一个Web服务器,Django或flask就是Web框架。

那么如何实现uWSGI和WSGI的配合呢?如何做到任意一个Web服务器,都能搭配任意一个框架呢?这就产生了WSGI协议。只要Web服务器和Web框架满足WSGI协议,它们就能相互搭配。所以WSGI只是一个协议,一个约定。而不是Python的模块、框架等具体的功能。

而uWSGI,则是实现了WSGI协议的一个Web服务器。即用来接受客户端请求,转发响应的程序。实际上,一个uWSGI的Web服务器,再加上Django这样的Web框架,就已经可以实现网站的功能了。

WSGI

WSGI,(WEB SERVER GATEWAY INTERFACE),Web服务器网关接口,是一种Web服务器网关接口,它是一个Web服务器(如Nginx,uWSGI等服务器)与Web应用(如Flask框架写的程序)通信的一种规范。当前运行在WSGI协议之上的Web框架有Bottle,Flask,Django

实现了Python Web程序与服务器之间交互的通用性。有了这个东西,web.py或者bottle或者django等等的Python Web开发框架,就可以轻松地部署在不同的Web server上了,不需要做任何特殊配置(也需要一些小小的配置调整)

WSGI协议其实是定义了一种server与application解耦的规范,即可以有多个实现WSGI server的服务器,也可以有多个实现WSGI application的框架,那么就可以选择任意的server和application组合实现自己的Web应用。

例如 uWSGI和 Gunicorn都是实现了WSGI server协议的服务器,Django,Flask是实现了WSGI application协议的Web框架,可以根据项目实际情况搭配使用。

像Django,Flask框架都有自己实现的简单的WSGI server,一般用于服务器调试,生产环境下建议用其他WSGI server,WSGI服务器的选择很多,包括uWSGI和gunicorn

uwsgi

同WSGI一样是一种通信协议

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

uWSGI (服务器)

它是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。用于接收前端服务器转发的动态请求并处理后发给 Web 应用程序。

因为apache也好,Nginx也罢,它们自己都没有解析动态语言如php的功能,而是分派给其他模块来做,比如apache就可以说内置了php模块,支持的非常爽,让人感觉好像apache就支持php一样。uwsgi实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

uWSGI是使用C编写的,显示了自有的uwsgi协议的Web服务器。它自带丰富的组件,其中核心组件包含进程管理、监控、IPC等功能,实现应用服务器接口的请求插件支持多种语言和平台,比如WSGI、Rack、Lua WSAPI,网管组件实现了负载均衡、代理和理由功能

uWSGI也可以当做中间件。

  • 如果是Nginx+uWSGI+App,那uWSGI就是一个中间件

  • 如果是uWSGI+App,那它就是服务器

Nginx+uWGSI

假设我们使用 Python 的 Django 框架写了一个网站,现在要将它挂在网上运行,我们一般需要:

  • Nginx 做为代理服务器:负责静态资源发送(js、css、图片等)、动态请求转发以及结果的回复。

  • uWSGI 做为后端服务器:负责接收 Nginx 转发的请求并处理后发给 Django 应用以及接收 Django 应用返回信息转发给 Nginx。

  • Django 应用收到请求后处理数据并渲染相应的返回页面给 uWSGI 服务器。

一个Django应用,通过WSGI协议连接uWSGI服务器,uWSGI服务器实现WSGI、http等协议,通过uwsgi协议和Nginx服务器实现http的动态请求和转发以及结果

django中如何部署uwsgi参考链接https://www.cnblogs.com/daminghuahua/p/16526900.html

问题:有 uWGSI 了,Django 为什么还需要 Nginx?

一个普通的个人网站,访问量不大的话,当然可以由 uWSGI 和 Django 构成。但是一旦访问量过大,客户端请求连接就要进行长时间的等待。这个时候就出来了分布式服务器,我们可以多来几台 Web 服务器,都能处理请求。

但是谁来分配客户端的请求连接和 Web 服务器呢?Nginx 就是这样一个管家的存在,由它来分配。这也就是由 Nginx 实现反向代理,即代理服务器。

Nginx 是一个 HTTP 和反向代理服务器

  • 正向代理:正向的就是由浏览器主动的想代理服务器发出请求,经代理服务器做出处理后再转给目标服务器

  • 反向代理:反向的就是不管浏览器同不同意,请求都会经过代理服务器处理再发给目标服务器

使用Nginx作为反向代理服务器的好处:

  • 安全

不管什么请求都要经过代理服务器,可以避免外部程序直接攻击Web服务器

  • 负载均衡

根据请求情况和服务器负载情况,将请求分配给不同的Web服务器,保证服务器性能

  • 提高Web服务器的IO性能

请求从客户端传到Web服务器是需要时间的,传递多长时间就会让这个进程阻塞多长时间,而通过反向代理,就可以由反向代理完整接受该请求,然后再传给Web服务器,从而保证服务器性能,而且有的一些简单的事情(比如静态文件)可以直接由反向代理处理,不经过Web服务器

总结

  • WSGI是一种通信协议

  • uwsgi是一种通信协议,常用于在uWSGI服务器与其他网络服务器的数据通信

  • 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器

百度百科上说uwsgi是一种线路协议而不是通信协议,个人更倾向于uwsgi是类似WSGI的通信协议的说法,uwsgi和WSGI都是基于CGI扩展出来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值