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协议登场
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框架协同工作。
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的速度更快)
Nginx(对外服务器)和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编写,效率高、性能稳定。
根据以下博客整理:
https://www.cnblogs.com/quegai18/p/10509996.html
https://www.cnblogs.com/wcx666/p/10444400.html
https://www.cnblogs.com/biggw/p/11342109.html
https://www.cnblogs.com/big-handsome-guy/p/8664618.html
https://www.cnblogs.com/guokaifeng/p/11007359.html
https://blog.csdn.net/mnszmlcd/article/details/78819237