用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

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