美文网首页
python项目环境部署(二)--uwsgi

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

作者: amyhy | 来源:发表于2017-09-18 11:43 被阅读30次

    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(默认)
    

    相关文章

      网友评论

          本文标题:python项目环境部署(二)--uwsgi

          本文链接:https://www.haomeiwen.com/subject/yuarsxtx.html