由于需要使用websocket实时推送消息,因此改用nginx+supervisor+daphne+gunicorn的部署方式,详细见下文
软件信息
- web框架
Django v1.11.8+Django channels v2.1.5【千万别用v2.1.4版本】 - python 库
gunicorn==19.9.0
daphne==2.3.0
supervisor==4.0.2 - 其他
nginx ,v1.12.2
使用它们的理由
- gunicorn,green unicorn 简称,unix系统的wsgi http服务器
处理符合wsgi的接口,使得底层处理与上层业务分开,Django仅负责业务层的处理,这里使用主要是官方推荐,uwsgi服务器使用的人也比较多 - daphne
支持HTTP, HTTP2 和 WebSocket 的asgi的服务器,这里主要是处理WebSocket 的请求 - supervisor
进程管理器,当web项目存在多个进程需要处理时,方便统一管理,如服务器down机重启时自启动等 - nginx
静态资源处理和请求的分发等,http请求指向gunicorn进程,websocket请求指向daphne进程等
最后提醒:注意版本号的匹配
配置
-
gunicorn
基本用法:gunicorn [OPTIONS] APP_MODULE
APP_MODULE值指向wsgi的可调用对象,对于Django,为project.wsgi:application#project泛称
,利用命令startproject
创建项目时可产生wsgi配置文件。
myproject.wsgi文件内容:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
application = get_wsgi_application()
options:
-c CONFIG, --config=CONFIG 指定一个配置文件
-b BIND, --bind=BIND (PORT), or unix:$(PATH) 绑定的IP与端口
-w WORKERS, --workers=WORKERS 推荐每个cpu 2-4个,即2 * CPUs + 1
-k WORKERCLASS, --worker-class=WORKERCLASS 要运行的工作进程的类型,如tornado、gevent等
-n APP_NAME, --name=APP_NAME
详细见官网帮助文档: http://docs.gunicorn.org/en/stable/settings.html
备注:仅启动gunicorn时,不会主动加载静态资源,若不使用静态服务器处理静态资源,则需要在urls文件中设置staticfiles_urlpatterns()来加载资源
-
daphne
基本用法:daphne -b 0.0.0.0 -p 8001 django_project.asgi:channel_layer
或者绑定UNIX sockets daphne -u /tmp/daphne.sock django_project.asgi:channel_layer
-b 指定IP
-p 指定端口
对于Django项目,django_project.asgi:channel_layer配置文件,需要手动创建asgi文件
例如:
import os
import django
import channels.routing
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
django.setup()
application = channels.routing.get_default_application()
最后执行: daphne -b 0.0.0.0 -p 8001 django_project.asgi:application
,这里需要自行指定p和b参数
-
supervisor
安装supervisor
后,可使用supervisor的client/server服务的命令
supervisord是supervisor的服务端程序命令
supervisorctl 客户端命令行
命令使用:
A. 启动 服务:
1.supervisord #直接启动
2.supervisord -c /etc/supervisord.conf #指定配置文件启动服务
supervisord启动成功后,可以通过supervisorctl客户端控制进程,启动、停止、重启。运行supervisorctl命令,不加参数,会进入supervisor客户端的交互终端,并会列出当前所管理的所有进程
B. 客户端(client)常用命令如下:
supervisorctl -c supervisor.conf status #查看supervisor的状态
supervisorctl -c supervisor.conf reload #重新载入 配置文件
supervisorctl -c supervisor.conf start [all]|[appname] #启动指定/所有 supervisor管理的程序进程
supervisorctl -c supervisor.conf stop [all]|[appname] #关闭指定/所有 supervisor管理的程序进程
C. 如何配置文件呢?
执行echo_supervisord_conf
打印可配置说明
执行echo_supervisord_conf > /etc/supervisord.conf
保存配置文件,每一个字段都有详细的说明
对于我的web项目来说,主要配置了 supervisor.conf的program项,其他根据实际需求去配置,因此可方便使用supervisorctl -c supervisor.conf start、stop [appname]
管理daphne和gunicorn进程
[program:daphne]
command=
daphne project.asgi:application -b -p #根据实际情况配置
directory= #项目位置
autostart=true ; supervisord 自动时自动启动
autorestart=true ; 自动重启
startsecs=0 ; 启动时间
stopwaitsecs=0 ;终止等待时间
stdout_logfile=/.../daphne_server_access.log #日志输出
stderr_logfile=/.../daphne_server_err.log #错误日志输出
[program:gunicorn]
command=gunicorn project.wsgi:application --name --workers 2 --bind= #根据实际情况配置
directory= #项目位置
autostart=true ; supervisord 自动时自动启动
autorestart=true ; 自动重启
stopwaitsecs=0 ;终止等待时间
startsecs=0 ; 启动时间
stdout_logfile=/.../gunicorn_server_access.log#日志输出
stderr_logfile=/.../yfHTTPServer/log/gunicorn_server_err.log#错误日志输出
不过注意:配置文件里面最好不要出现中文,会报编码错误,哪怕是注释,这里不确定是否与我的服务器有关系,没有去深究,所以报错的时候注意看错误提示
最后
nginx暂时不总结,下章