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/