nginx+supervisor+daphne+gunicorn部署Django应用

由于需要使用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暂时不总结,下章

你可能感兴趣的:(nginx+supervisor+daphne+gunicorn部署Django应用)