dxbjfu0 2019-06-26
前几日在生产服务器上部署Python web.py的一个项目,发现自己对服务器的一些概念不是很明白,遂查资料看了一会,特此做出个人的一些算是笔试的总结吧,以便之后可以回顾
全称是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(回调函数)。
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服务器对字符串进行迭代而影响速度。
是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等
一种规范,或者说是一种通信协议,主要用在代理服务器(如Nginx)与uWSGI服务器之间的通信,而WSGI主要是用在uWSGI服务器和应用程序之间的通信。
从上面可以看出,Nginx这一层并不是必须的,uWSGI服务器完全可以完成整个和浏览器的交互,但是需要考虑下面的情况
参考文章:
python nginx+uwsgi+WSGI 处理请求详解
Nginx + uWSGI + Webpy配置&原理.md