avatar

目录
Gunicorn + Nginx 部署Web服务

Gunicorn

Gunicorn“绿色独角兽”是一个被广泛使用的高性能的Python WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork worker模式,具有使用非常简单,轻量级的资源消耗,以及高性能等特点。
Gunicorn 服务器作为wsgi app的容器,能够与各种Web框架兼容(flaskdjango等),得益于gevent等技术,使用Gunicorn能够在基本不改变wsgi app代码的前提下,大幅度提高wsgi app的性能。

架构

服务模型(Server Model)

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

Master(管理者)

主程序是一个简单的循环,监听各种信号以及相应的响应进程。master管理着正在运行的worker集合,通过监听各种信号比如TTIN, TTOU, and CHLD. TTIN and TTOU响应的增加和减少worker的数目。CHLD信号表明一个子进程已经结束了,在这种情况下master会自动的重启失败的worker。

worker

woker有很多种,包括:ggevent、geventlet、gtornado等等。这里主要分析ggevent。
每个ggevent worker启动的时候会启动多个server对象:worker首先为每个listener创建一个server对象(注:为什么是一组listener,因为gunicorn可以绑定一组地址,每个地址对于一个listener),每个server对象都有运行在一个单独的gevent pool对象中。真正等待链接和处理链接的操作是在server对象中进行的。

例子:

在一个Django项目中

  1. 下载gunicorn

    Code
    1
    pip install gunicorn
  2. 加入Gunicorn的配置文件gunicorn.conf.py 具体如下

    Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import logging
    import logging.handlers
    from logging.handlers import WatchedFileHandler
    import os
    import multiprocessing

    bind = "127.0.0.1:8080" #绑定的ip与端口 <<<————————————
    backlog = 512 #监听队列数量,64-2048
    chdir = '/root/sites/DjangoBlog' #gunicorn要切换到的目的工作目录 <<<————————————
    worker_class = 'sync' #使用gevent模式,还可以使用sync 模式,默认的是sync模式
    workers = multiprocessing.cpu_count()
    #workers = 4 # multiprocessing.cpu_count() #进程数
    threads = 16 #multiprocessing.cpu_count()*4 #指定每个进程开启的线程数
    loglevel = 'info' #日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
    access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"' # 日志格式

    accesslog = "/root/sites/DjangoBlog/log/gunicorn_access.log" #访问日志文件 <<<————————————
    errorlog = "/root/sites/DjangoBlog/log/gunicorn_error.log" #错误日志文件 <<<———————————
    # accesslog = "-" #访问日志文件,"-" 表示标准输出
    # errorlog = "-" #错误日志文件,"-" 表示标准输出

    proc_name = 'fof_api' #进程名
    # 上面有箭头的地方都要修改
  3. 启动命令

    Gunicorn常见参数,

    -c 指定一个配置文件(py文件)
    -b 与指定的socket进行绑定
    -D 以守护进程形式来运行Gunicorn进程,其实就是将这个服务放到后台去运行
    -w 工作的进程数量

    根据Gunicorn配置文件 和 Django自带wsgi 启动

    Code
    1
    gunicorn -c gunicorn.conf.py djangodemo.wsgi -D # djangodemo 是djangodemo项目的名字

    指定端口和工作的进程运行

    Code
    1
    gunicorn -w 3 djangodemo.wsgi -b 0.0.0.0:8100

    这里使用的djangodemo.wsgiDjango自带的wsgi

    WSGI(Web Server Gateway Interface),翻译为Python web服务器网关接口,即PythonWeb应用程序(如Flask)和Web服务器(如Nginx)之间的一种通信协议。也就是说,如果让你的Web应用在任何服务器上运行,就必须遵循这个协议。

    那么实现WSGI协议的web服务器有哪些呢?就比如uWSGIgunicorn。两者都可以作为Web服务器。可能你在许多地方看到的都是采用Nginx + uWSGI(或gunicorn)的部署方式。实际上,直接通过uWSGIgunicorn直接部署也是可以让外网访问的,那你可能会说,那要Nginx何用?别急,那么接来下介绍另一个Web服务器——Nginx

Nginx

Nginx作为一个高性能Web服务器,具有负载均衡、拦截静态请求、高并发…等等许多功能,

这就是为为让Nginx做代理的原因

修改Nginx 文件目录中的nginx.conf, 将server片段 注释 或者删掉(建议将nginx.conf备份),修改内容如下

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server{
listen 80;
server_name axf.sharemsg.cn; #此处写你的域名或者ip
charset utf-8;
client_max_body_size 200m;
access_log /var/log/nginx/build-access.log;
error_log /var/log/nginx/build-err.log;
location = /favicon.ico { access_log off; log_not_found off; }
location / {
proxy_pass http://127.0.0.1:12356; #你Django服务跑的那个端口 <<<————————————
proxy_set_header Host $host;
#捕获客户端真实IP
proxy_set_header X-Real-IP $remote_addr; #$remote_addr 代表客户端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

location /static{
alias /home/ubuntu/liuda/项目代码/static/; #静态文件的配置 <<<————————————
# 路径就是你Django的static目录的路径
}

}

使用Django项目的一个特性,将Django项目 生成静态文件,命令如下

Code
1
python manage.py collectstatic

然后将Nginx的配置文件进行修改

重启Nginx

Code
1
nginx -s reload

运行Nginx就可以了

文章作者: Jack-Roc
文章链接: http://jack-roc.top/2018/11/10/gunicorn/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Jack-Roc
打赏
  • 微信
    微信
  • 支付寶
    支付寶