wsgi是什么?
是一个协议,定义了一套接口,实现服务器端和应用端的通信的规范化,使web底层和application解耦。就如下图:
wsgi主要有两个工作:
1.和服务端的交互:从底层解析http协议,然后调用应用程序提供的环境信息(host、post、进程模式等)和回调函数(这个回调函数就是将app设置的http header、status等信息传递给服务端)。
2.和app的交互:即上面的回调函数所做的内容,将app设置的http header、status等信息生成返回的header、body、status等,返回给服务端。
wsgi server是什么?
是自己写web server,使用wsgi协议来调用application。
换言之,nginx无法直接和flask 的application通信,需要借用wsgi server。而gunicorn就是这样的 wsgi server。当然flask本身也有个wsgi 服务器是werkzeug,当然性能都不好,自带的web server 更多的是测试用途, 线上发布时,则使用高性能的 wsgi server或者是联合nginx做uwsgi 。
WSGI的优点
由于WSGI的解耦特性,理论上,任何一个符合WSGI规范的App都可以部署在任何一个实现了WSGI规范的Server上,这给Python Web应用的部署带来了极大的灵活性。
例如,可以重写环境变量,根据目标URL,将请求消息路由到不同的app上,就像实现nginx 转发一样,可以把阻塞高的转给tornado的app做。
gunicorn介绍
工作模式 master worker
1.很像nginx模式,预先启动多个进程,并且监听在同一个端口上,至于如何调度,就要靠linux内核去抢了
2.有一个中心主控的master进程,管理一组worker进程,所有的请求和响应完全由worker进程来处理。
master进程负责的动态管理已经启动的进程,比如动态添加减少进程。
查看源码,就是一个简单的循环,用来不断侦听不同进程信号并作出不同的动作,仅此而已。它通过一些信号,诸如TTIN, TTOU, 和CHLD等等, 管理着那些正在运行的worker进程。
TTIN 和 TTOU信号是告诉主控master进程增加或减少正在运行的worker数量。
CHLD信号是在一个子进程已经中止之后,由主控master进程重启这个失效的worker进程。
默认是select方式、长连接
参考链接:
master-worker:http://xiaorui.cc/archives/1735