用gunicorn提高Django的并发能力

Django提供了自带的runserver命令启动服务,这种方式一般用于开发环境以便于调试程序,并发量比较小的时候也是可以应对的,但是并发量超过这种方式的承载能力时,就需要使用gunicorn启动Django的服务来提高并发能力了。

一、安装依赖包:

pip3 install django==2.0.6 gevent==1.4.0 gunicorn==19.7.1

二、在项目的settings.py中的INSTALLED_APPS添加gunicorn:

INSTALLED_APPS = [
    ...,
    'gunicorn',
]

三、编写gunicorn的配置文件gunicorn_config.py,放在项目的settings.py同级目录下:

import os
import multiprocessing

reload = False  # 代码更新时不重启项目
daemon = False  # 不守护Gunicorn进程
backlog = 2048  # 服务器中排队等待的最大连接数,建议值64-2048,超过2048时client连接会得到一个error。
workers = multiprocessing.cpu_count() * 2 + 1  # 用于处理工作的进程数,这里使用了建议的值
keyfile = '.../server.key'  # ssl证书密钥文件路径
certfile = '.../server.crt'  # ssl证书文件路径
worker_class = 'gevent'  # worker进程的工作方式,有sync、eventlet、gevent、tornado、gthread, 缺省值sync。
worker_connections = 1000  # 客户端最大同时连接数。只适用于eventlet、gevent工作方式。
pythonpath = '/usr/bin/python3 -u'  # 逗号分隔的Python执行路径,可以加上参数,这里只有一个路径,-u表示使用无缓冲的二进制终端输出流
access_log_format = '%(t)s %(h)s "%(r)s" %(s)s %(b)s "%(f)s" "%(L)s"'  # 日志文件格式
accesslog = '-'  # 日志文件路径,'-'表示输出到终端
errorlog = '-'  # 错误日志文件路径,'-'表示输出到终端
bind = '0:1999'  # 指定监听的地址和端口,这里使用nginx转发了,所以监听特殊端口
project_name = 'mysite'
proc_name = 'gunicorn_%s' % project_name  # 设置进程名称
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '%s.settings' % project_name)  # 设置环境变量指定Django运行使用的配置文件
os.environ.setdefault('WERKZEUG_RUN_MAIN', 'true')  # 设置环境变量告诉wekzeug这个是用于reload的主进程

四、编写启动服务的shell脚本start.sh,放在项目的manage.py同级目录下:

使用脚本启动的原因是supervisor杀不掉服务的子进程,需要用脚本杀一下再启动新的服务。

#!/bin/sh
pname=$1
port=$2
if [ -z "${pname}" ]
then
    pname="mysite"
fi
if [ -z "${port}" ]
then
    if [ "$pname"x = "mysite"x ]
    then
        port="1999"
    else
        echo "error project name \"$pname\""
        exit 0
    fi
fi
ps aux | grep ${pname}/gunicorn_config.py | grep ${port} | awk '{print $2}' | xargs kill -9 > /dev/null 2>&1  # 根据进程名和端口号过滤出进程ID,杀死已存在的服务进程
unbuffer -p gunicorn3 ${pname}.wsgi:application -c ${pname}/gunicorn_config.py -b 0:${port}  # 启动新的服务
# unbuffer表示使用无缓冲的二进制输出流,-p表示unbuffer可以从管道命令"|"的输出中读取内容(兼容supervisor)
# ${pname}.wsgi:application是项目中应用实例的位置
# ${pname}/gunicorn_config.py是第三步编写的配置文件的位置
# 0:${port}是指定监听的地址和端口,这个会覆盖gunicorn_config.py中的配置,加上这个便于过滤进程ID

五、supervisor配置文件

[program:mysite]
environment=USER=root,PYTHONPATH=/usr/bin/
directory=/var/www/mysite/
command=bash start.sh mysite
autostart=true
autorestart=true
stopasgroup=true
stderr_logfile=/var/log/supervisor/mysite_error.log
stdout_logfile=/var/log/supervisor/mysite_out.log
user=root
redirect_stderr=false
startretries=20
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20

参考链接:

https://yunsonbai.top/2017/06/15/gunicorn-django/

https://www.jianshu.com/p/5600af9ff238

https://docs.gunicorn.org/en/stable/settings.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章