python项目环境部署(二)--uwsgi

2017-09-18  本文已影响30人  amyhy

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服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。“中间件”组件可以执行以下功能:

常见的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 访问

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(默认)
上一篇下一篇

猜你喜欢

热点阅读