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扩展出来的。