参考资料
- 认识uWSGI、uwsgi、wsgi
- WSGI & uWSGI 以及 uwsgi
- uWSGI、uwsgi、WSGI、之间的关系,为什么要用nginx加uWSGI部署。
- Django部署时为什么要用 uWSGI与 Nginx? 以及 WSGI,uwsgi等协议
- Django框架简介,wsgiref 与 jinja2 模块
- uwsgi概念和作用
一.概述
- WSGI是一种通信协议。
- uwsgi是一种传输协议。
- uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
二.WSGI
⏹Python语言有多种web框架:Django
,Flask
,Tornado
,web.py
等.
我们可以基于这些web框架开发web应用基于Python语言开发的web应用需要部署在支持python的web服务上:uWSGI
,Gunicorn
,Waitress
,flup
.
⏹我们可能会遇到这样的问题: 当要把一个web服务器和一个基于框架开发的web应用结合起来时,却发现他们并不兼容,例如基于Django框架开发的web应用只能部署在uWSGI
上,而无法部署在Gunicorn
上
🤔那么如何保证基于不同的web框架开发的web应用能运行在各个web服务器上呢?
或者说如何让各个web服务器兼容基于不同的web框架开发的web应用呢?
这个时候需要WSGI协议登场
2.1 协议简介1
-
WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。自从 WSGI 被开发出来以后,许多其它语言中也出现了类似接口: java有Servlet API,Ruby 有 Rack。
-
WSGI 是作为 Web 服务器与 Web 应用程序或应用框架之间的一种低级别的接口,以提升可移植 Web 应用开发的共同点。WSGI 是基于现存的 CGI 标准而设计的
-
WSGI协议允许开发者可以混合匹配web服务器和web框架,选择一个适合的配对。比如,可以在Gunicorn 或 Nginx/uWSGI 或 Waitress等web服务器上运行 基于Django, Flask等开发的web应用。
-
web服务器必须具备WSGI接口,所有的现代Python Web框架都已具备WSGI接口
它让你不对代码作修改就能使服务器和特点的web框架协同工作。
也就是说web框架和web服务器都必须实现WSGI接口
2.2 协议简介2
WSGI
协议主要包括server
和application
两部分:
WSGI server
负责从客户端接收请求,将request
转发给application
,将application
返回的response
返回给客户端;WSGI application
接收由server
转发的request
,处理请求,并将处理结果返回给server
。application
中可以包括多个栈式的中间件(middlewares
),这些中间件需要同时实现server与application,因此可以在WSGI服务器与WSGI应用之间起调节作用:对服务器来说,中间件扮演应用程序,对应用程序来说,中间件扮演服务器。
WSGI
协议其实是定义了一种server
与application
解耦的规范,即可以有多个实现WSGI server
的服务器,也可以有多个实现WSGI application
的框架,那么就可以选择任意的server
和application
组合实现自己的web
应用。
例如uWSGI
和Gunicorn
都是实现了WSGI server
协议的服务器,Django
,Flask
是实现了WSGI application
协议的web
框架,可以根据项目实际情况搭配使用。
- wsgi server (比如uWSGI)实现wsgi协议规范的服务器我们叫做wsgi服务器,也就是uWSGI服务器
- wsgi application(比如django )实现wsgi协议的应用,我们叫做wsgi应用,比如Django,Falsk
WSGI server相当于螺丝,WSGI application相当于螺母,只有实现了标准的服务器和框架才能部署到一起
三.uwsgi
uwsgi协议(传输协议,速度很快):uWSGI服务器
实现的一个自有的协议,是uWSGI 的一种内部协议(之前的协议都是使用字符串,而采用二进制来存储和解析数据的uwsgi的速度更快)
- WSGI是一种通信协议。
- uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器(Nginx)的数据通信。
Nginx(对外服务器)和uWSGI(对内服务器)之间的通信,是基于uwsgi协议进行的
四.uWSGI
概述: 是一个web服务器,类似的web服务器还有部署java web应用的tomcat
uWSGI
旨在为部署分布式集群的网络应用开发一套完整的解决方案。主要面向web
及其标准服务。由于其可扩展性,能够被无限制的扩展用来支持更多平台和语言。uWSGI
是一个web
服务器,实现了WSGI
协议,uwsgi
协议,http
协议等。
uWSGI
的主要特点是:
- 超快的性能
- 低内存占用
- 多
app
管理 - 详尽的日志功能(可以用来分析
app
的性能和瓶颈) - 高度可定制(内存大小限制,服务一定次数后重启等)
Python需要使用nginx + uWSGI 提供静态页面访问,和高并发
php 需要使用 nginx + fastcgi 提供高并发
java 需要使用 nginx + tomcat 提供 web 服务
Python标准库提供的独立WSGI服务器叫wsgiref
,Django开发环境用的就是这个模块来做服务器,
上线之后一般使用uWSGI服务器
uWSGI实现了WSGI的所有接口, uWSGI代码完全用C编写,效率高、性能稳定。