首页  >  文章  >  后端开发  >  nginx+gunicorn+django

nginx+gunicorn+django

WBOY
WBOY原创
2016-08-08 09:30:071555浏览

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">官方地址:http://gunicorn.org/</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">                  http://docs.gunicorn.org/en/19.2/</span>

参考地址:http://www.cnblogs.com/ArtsCrafts/p/gunicorn.html

                  http://rfyiamcool.blog.51cto.com/1030776/1276364

一、前言介绍

    WSGI Server有哪些:
        比如Flask、webpy、Django、CherryPy 都自带WSGI Server 。当然性能都不好,自带的web server更多的是测试用途, 线上发布时,则使用高性能的 wsgi server或者是联合nginx做uwsgi 。

    

二、安装gunicorn

     ~$ sudo pip install gunicorn

     如果想让Gunicorn支持异步workers 的话需要安装一下三个python包          

     ~$ sudo pip install greenlet

     ~$ sudo pip install eventlet

     ~$ sudo pip install gevent

说明:如果安装greenlet失败的话,你需要安装 Python headers

    ~$ sudo apt-get install python-dev

我们可以查看一下gunicorn的版本

    ~$ gunicorn --version
          gunicorn (version 19.1.1)

二、gunicorn 命令 使用

    成功安装 gunicorn 之后有以下三个指令你可以直接使用,用来启动 gunicorn 运行 wsgi application或者 wsgi frameworks。

    1. gunicorn

        Gunicorn server最基本的命令,直接用来运行最基本的 wsgi application 。

        用法:gunicorn [OPTIONS] APP_MODULE

        OPTIONS 可选参数 运行gunicorn的配置选项,后面会讲到。

        APP_MODULE 指定 wsgi application文件,书写格式 $(MODULE_NAME):$(VARIABLE_NAME)。其中 module_name用来指定将要运行的 wsgi application文件,可是一个完整的点缀名。

        

比如当前目录myapp目录下有个python包gunicorn_app, gunicorn_app包下有一个wsgi application文件test.py。

        则module_name可以直接写成gunicorn_app.test。

        variable_name表示在module_name文件中要调用的对象(是一个WSGI callable,可以是一个函数)名。

        按照上面的例子,当前目录为/home/workspace/myapp,myapp中有一个包gunicorn_app,test.py代码如下:

def app(environ, start_response):
    """Simplest possible application object"""
    data = 'Hello, World!\n'
    status = '200 OK'
    response_headers = [
        ('Content-type','text/plain'),
        ('Content-Length', str(len(data)))
    ]
    start_response(status, response_headers)
    return iter([data])

     我们将要运行test.py中的app

     gunicorn gunicorn_app.test:app

    2. gunicorn_django

        guniorn_django命令是用来将 Django app部署到 Gunicorn Server上的。

        其实也非常简单,原理和 gunicorn一样,只是gunicorn_django做了特殊处理,使得更加适合Django。

        基本用法:gunicorn_django [OPTIONS] [SETTINGS_PATH]

        OPTIONS 前面已经说过了。
        SETTINGS_PATH django app中 settings.py文件所在的目录,不写的话默认在当前目录下查找。

        不过这种用法适用于django1.4以前,对于Django1.4版本以后强烈推荐使用gunicorn命令。

        

    3. gunicorn_paster

        这个命令有兴趣可以到官方文档研究。

三、Gunicorn配置

     Gunicorn从三个不同的地方读取配置信息。

     第一个地方:从framework定义的配置信息中读取,目前只对Paster框架有效。

     第二个地方:在命令行中定义,命令行中定义的配置信息将会覆盖掉框架中定义的相同的参数名的值。

     第三个地方:创建一个配置文件,把配置信息写入文件(是一个python源文件,所以你就像在写python代码一样)中。

     通过 gunicorn -h 查看所有命令配置信息

     也可以通过官方文档查看更详细信息:http://docs.gunicorn.org/en/19.2/

     

     如在上面myapp例子的基础上

     gunicorn --workers=4 --bind=127.0.0.1:8000 myapp.gunicorn_app.test:app

     上面的命令启动4个workers,绑定到127.0.0.1:8000

     或者你使用配置文件,如下是一个config.py配置文件源码:

     

import multiprocessing

bind = "127.0.0.1:8001"
workers = multiprocessing.cpu_count() * 2 + 1

     gunicorn --config=config.py myapp.gunicorn_app.test:app

四、gunicorn框架介绍

     Gunicorn是基于pre-fork模型的。也就意味着有一个中心管理进程(master process)用来管理worker进程集合。Master从不知道任何关于客户端的信息。所有请求

和响应处理都是由worker进程来处理的。

     Master(管理者)

     主程序是一个简单的循环,监听各种信号以及相应的响应进程。master管理着正在运行的worker集合。

     Worker类型

     1. Sync Workers

         最基本的也是默认的worker type。

         一个同步的worker class,同一时间只能控制一个request请求。

     2. Async Workers

        异步workers的使用是基于Greenlets(通过Eventlet和Gevent)。所以使用此worker type之前一定要安装好python对应的包。

        Greenlets是python多线程协作的一个实现。

     3. Tornado Workers  

         这是一个Tornado worker class。

     

五、Gunicorn部署

       使用Gunicorn必须基于一个代理服务器。

       1. Nginx Configuration

           虽然有很多HTTP代理可以使用,但是我们还是强烈推荐Nginx。如果你选择了其他代理服务器,你需要确认,当你使用默认的Gunicorn workers时,它能够buffers slow clients。没有buffering Gunicorn将很容易受 denial of service attacks的影响。也可使用 slowloris 去核实你的代理服务器是否工作良好。

         如下是一个nginx配置文件实例(假设127.0.0.1:8888端口已经被gunicorn绑定监听):

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6
        listen 80;
        client_max_body_size 4G;
        server_name www.android_stat.com

        keepalive_timeout 5;



        location / {
                try_files $uri @proxy_to_app;
        }

        location @proxy_to_app {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_pass http://127.0.0.1:8888;
        }
六、监控Gunicorn

       注意:要监控Gunicorn的时候,Gunicorn不能启动daemon模式,如果使用daemon模式会fork出一个进程,这样监控工具就没法监控这个进程。

       我在这只介绍supervisor

      1. Supervisor

          Supervisor可以用来监控进程,下面是一个简单的supervisor的配置文件:

[program:gunicorn]
command=/path/to/gunicorn main:application -c /path/to/gunicorn.conf.py
directory=/path/to/project
user=nobody
autostart=true
autorestart=true
redirect_stderr=true

       

    

以上就介绍了nginx+gunicorn+django,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn