前几日在生产服务器上部署Python web.py的一个项目,发现本身对服务器的一些概念不是很明白,遂查资料看了一会,特此作出我的的一些算是笔试的总结吧,以便以后能够回顾html
全称是Web Server Gateway Interface
,WSGI不是服务器,也不是API或者Python的什么模块之类的,它只是一种Python web的一种规范,相似于Java web里面的servlet规范,WSGI规范定义了web应用(web框架)与web服务器之间交互的接口,约定了WSGI server怎么去调用web应用程序类或者函数,web应用程序须要符合什么样的规范。而下面说的uWSGI就是一种支持WSGI规范的服务器,或者你能够将uWSGI理解为一种支持WSGI规范的容器,因此咱们能够将web应用部署到uWSGI中,而后当它接受请求时,就会按照WSGI定义的接口回调web应用来处理请求。
WSGI定义了两种角色,分别为server端(或者gateway端)和application端(或者framework端),须要server端和application端都支持WSGI,通常而言server端是uWSGI,application端是一个可调用对象(callable object),可调用对象能够是类、方法或者可调用的实例,这个对象接受两个参数environ(请求的环境变量)和start_response(回调函数)。python
def simple_app(environ, start_response): """ docstring, it's just a test application """ status = '200 OK' response_headers = [('Content-type', 'text/html')] start_response(status, response_headers) return ['Hello World']
上面的回调函数的做用是让WSGI server返回响应的首部和HTTP状态码,这个函数必须有两个参数,第一个是状态码,第二个是响应的首部元组组成的列表,而且回调函数设置状态码和首部须要在return响应HTTP body以前执行。
值得一说的是,return返回的响应信息应该是一个可迭代对象,上面的例子中将字符串放在了列表里面,若是直接返回字符串,会致使WSGI服务器对字符串进行迭代而影响速度。nginx
是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等git
一种规范,或者说是一种通讯协议,主要用在代理服务器(如Nginx)与uWSGI服务器之间的通讯,而WSGI主要是用在uWSGI服务器和应用程序之间的通讯。github
从上面能够看出,Nginx这一层并非必须的,uWSGI服务器彻底能够完成整个和浏览器的交互,可是须要考虑下面的状况web
参考文章:
python nginx+uwsgi+WSGI 处理请求详解
Nginx + uWSGI + Webpy配置&原理.mddjango