欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

nginx+gunicorn+django

程序员文章站 2022-03-18 15:26:22
...
官方地址:http://gunicorn.org/
                  http://docs.gunicorn.org/en/19.2/

参考地址: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教程有兴趣的朋友有所帮助。