WSGI(Web Server Gateway Interface),既不是服务器,也不是应用,而是一种接口(规范),描述web server如何与web application通信的规范:
1. 服务器的请求处理要调用符合WSGI规范的网关接口;
2. 由网关接口来调用应用程序,并且其要定义start_response(status, headers)函数,用于返回响应;
3. 应用程序须是一个可调用对象(函数/类),webapp(environ, start_response)。接受两个参数,environ是环境设置的字典,由服务器和WSGI网关接口设置,start_response是由网关接口定义的函数。
网络通信的完整流程:
先创建一个web服务器,监听端口,接收请求,并将请求路由转发给对应的应用程序。
再创建一个web应用程序,用于接收到请求,经过必要的处理,返回响应给服务器。
服务器接收响应,返回给客户端(浏览器)
WSGI 只适用于 Python 语言,定义了 web服务器和 web应用之间的接口规范。解耦了服务器类与应用程序类,只要 web服务器和 web应用都遵守WSGI协议,那么 web服务器和 web应用就可以随意的组合
WSGI规范规定,Application 必须是一个可调用的对象,它可以是函数,可以实现了__call__的类的实例对象,也可以是实现了__iter__的类对象。
Web框架的作用主要是方便我们开发 web应用程序,也遵循WSGI协议,以flask为例,遵循WSGI协议体现的源码:
class Flask(_PackageBoundObject):
.....
def wsgi_app(self, environ, start_response):
ctx = self.request_context(environ)
error = None
try:
try:
ctx.push()
response = self.full_dispatch_request()
except Exception as e:
error = e
response = self.handle_exception(e)
except:
error = sys.exc_info()[1]
raise
return response(environ, start_response)
finally:
if self.should_ignore_error(error):
error = None
ctx.auto_pop(error)
def __call__(self, environ, start_response):
return self.wsgi_app(environ, start_response)
...
在Flask中处理请求的入口__call__方法, 又调用了另一个方法wsgi_app,所有的请求将会在这几行代码中处理完成, 并且最终返回
gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 main:app
worker-connection 是对于 gevent worker 类的特殊设置。(2CPU)+1 是建议的worker数量。因为这里是单核,我们设置的是3个worker。在这种情况下,最大的并发请求数是3000(3个worker1000个连接数/worker)