Gunicorn
Gunicorn“绿色独角兽”
是一个被广泛使用的高性能的Python WSGI UNIX HTTP
服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork worker
模式,具有使用非常简单,轻量级的资源消耗,以及高性能等特点。
Gunicorn 服务器作为wsgi app的容器,能够与各种Web框架兼容(flask
,django
等),得益于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
项目中
下载
gunicorn
Code1
pip install gunicorn
加入
Gunicorn
的配置文件gunicorn.conf.py
具体如下Code1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23import 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' #进程名
# 上面有箭头的地方都要修改启动命令
Gunicorn
常见参数,-c 指定一个配置文件(py文件)
-b 与指定的socket进行绑定
-D 以守护进程形式来运行Gunicorn进程,其实就是将这个服务放到后台去运行
-w 工作的进程数量根据
Gunicorn配置
文件 和Django
自带wsgi
启动Code1
gunicorn -c gunicorn.conf.py djangodemo.wsgi -D # djangodemo 是djangodemo项目的名字
指定端口和工作的进程运行
Code1
gunicorn -w 3 djangodemo.wsgi -b 0.0.0.0:8100
这里使用的
djangodemo.wsgi
是Django
自带的wsgi
WSGI
(Web Server Gateway Interface),翻译为Python web
服务器网关接口,即Python
的Web
应用程序(如Flask
)和Web
服务器(如Nginx
)之间的一种通信协议。也就是说,如果让你的Web
应用在任何服务器上运行,就必须遵循这个协议。那么实现
WSGI
协议的web服务器有哪些呢?就比如uWSGI
与gunicorn
。两者都可以作为Web服务器。可能你在许多地方看到的都是采用Nginx
+uWSGI
(或gunicorn
)的部署方式。实际上,直接通过uWSGI
或gunicorn
直接部署也是可以让外网访问的,那你可能会说,那要Nginx
何用?别急,那么接来下介绍另一个Web服务器——Nginx
Nginx
Nginx
作为一个高性能Web服务器,具有负载均衡、拦截静态请求、高并发…等等许多功能,
这就是为为让Nginx
做代理的原因
修改Nginx 文件目录中的nginx.conf
, 将server
片段 注释 或者删掉(建议将nginx.conf备份),修改内容如下
1 | server{ |
使用Django
项目的一个特性,将Django
项目 生成静态文件,命令如下
1 | python manage.py collectstatic |
然后将Nginx
的配置文件进行修改
重启Nginx
1 | nginx -s reload |
运行Nginx
就可以了