WSGI是什么?
WSGI,全称Web Server Gateway Interface
,或者Python Web Server Gateway Interface,是为Python语言定义的web服务器和Web应用程序或框架之间的一种简单而通用的接口。
WSGI 的官方定义是,the Python Web Server Gateway Interface。从名字就可以看出来,这东西是一个Gateway,也就是网关。网关的作用就是在协议之间进行转换。
WSGI是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,以提升可移植Web应开发的共同点。WSGI是基于现存的CGI标准而设计的。
很多框架都自带了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。当然性能都不好,自带的 web server 更多的是测试用途,发布时则使用生产环境的 WSGI server或者是联合 nginx 做 uwsgi 。
也就是说,WSGI就像是一座桥梁,一边连着web服务器,另一边连着用户的应用。但是呢,这个桥的功能很弱,有时候还需要别的桥来帮忙才能进行处理。
WSGI的作用
WSGI有两方:“服务器”或“网关”一方,以及“应用程序”或“应用框架”一方。服务方调用应用方,提供环境信息,以及一个回调函数(提供给应用程序用来将消息头传递给服务器方),并接收Web内容作为返回值。
所谓的 WSGI中间件同时实现了API的两方,因此可以在WSGI服务和WSGI应用之间起调解作用:从WSGI服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。“中间件”组件可以执行以下功能:
- 重写环境变量后,根据目标URL,将请求消息路由到不同的应用对象。
- 允许在一个进程中同时运行多个应用程序或应用框架。
- 负载均衡和远程处理,通过在网络上转发请求和响应消息。
- 进行内容后处理,例如应用XSLT样式表。
常见的WSGI容器
WSGI是一个同步接口,所以框架自带的WSGI是无法实现异步的。主流的选择是Gunicorn和uWSGI。
uWSGI
uWSGI是应c编写的,它是一个WEB服务器,实现的了自有的uwsgi协议的Web服务器。他自带丰富的组件,其中核心组件包含进程管理、监控、IPC等功能,实现应用Web服务器接口的请求插件支持多种语言和平台,比如WSGI、Rack、Lua WSAPI,网关组件实现了负载均衡、代理和路由组成。
它启动的命令相对复杂一些
简单的WSGI应用
在项目的目录下新建一个blog.py文件
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
可以用 --processes 选项添加更多的进程,或者使用 --threads 选项添加更多的线程 (或者可以同时添加),而且开启了9191的Web接口,返回uWSGI的信息,以及不同进程和线程的详细使用情况。对你的应用进行几次请求,然后telnet到端口9191,会获得大量有趣的信息
uwsgi --http :9090 --wsgi-file blog.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
以上是http方式,启动后可以直接通过127.0.0.1:9090 访问
- --http-socket 和--http其实是完全不同的两个选项。如果想直接裸跑uWSGI,应该使用--http,它产生一个额外的进程将请求转发给Workers,如果希望他被反向代理(比如和Nginx一起来用),应该使用--http-socket
uwsgi支持多种配置风格,接下来使用.ini文件。新建blog.ini
[uwsgi]
http=:8089
chdir = /home/student/project/newsite/
wsgi-file = /home/student/project/newsite/newsite/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:9191
直接在终端用uwsgi --blog.ini运行。
Gunicorn
gunicorn,是“Green Unicorn”是一个呗广泛使用的高性能的Python WSGI UNIX HTTP服务,具有使用非常简单,轻量级的资源消耗,以及高性能等特点。支持Django,paster,wsgi程序。自动管理多个worker进程。
在装好gunicorn之后, 我们来看看gunicorn的hello world。代码来自官网,将下面的代码放到myapp.py中:
def app(environ, start_response):
data = b"Hello, World!\n"
start_response("200 OK", [("Content-Type", "text/plain"),("Content-Length", str(len(data)))])
return iter([data])
然后我们启动:gunicorn -w 4 myapp:app
![gun.JPG](https://img.haomeiwen.com/i5903064/0aed2b7ad6a460e8.JPG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上图展示了两个很重要的信息:
第一:启动了四个worker,这是通过"-w 4"指定(默认为1)
第二:worker的工作模型是sync(默认)
网友评论