专栏首页pythonista的日常django2.2+Daphne+nginx+supervisor 生产环境部署

django2.2+Daphne+nginx+supervisor 生产环境部署

之前项目中使用了 webscoket 进行实现消息实时通知,我们是另外单独运行了一个消息推送服务项目,使用了django-channels 实现websocket,项目使用的是asgi 协议,不是原先的wsgi协议。运行项目时,提示也和wsgi的不一样,如下图:

官方推荐的 asgi 服务器是 daphne 处理 websocket 请求,下面说下如何部署daphne和supervisor。

1.安装部署daphne

安装 django-channels 的时候 daphne 就已经连带一起安装了 在项目的根目录新建一个asgi.py文件,和 wsgi文件同级,内容如下:

import os
import django
from channels.routing import get_default_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名称.settings")
django.setup()
application = get_default_application()

2.测试 daphne 配置是否正确: 输入如下命令,看 asgi 服务是否正常启动:

daphne -b 0.0.0.0 -p 8008 项目名称.asgi:application

在websocket在线测试网站,测试websocket是否可以正确建立链接

3.配置supervisor

首先是在终端输入命令 pip install supervisor 安装 supervisor 执行 echo_supervisord_conf > /etc/supervisord.conf 生成supervisor的配置文件 编辑配置文件,输入如下内容:

[program:supervisor项目名称]
directory=/dqcy_message  #项目目录
command=daphne -b 0.0.0.0 -p 8008 代码项目名称.asgi:application #启动命令
autostart=true
autorestart=true
stdout_logfile=/tmp/websocket.log  #日志
redirect_stderr=true

启动supervisor命令:supervisord -c /etc/supervisord.conf 启动或者停止 supervisor 项目服务:

supervisorctl start supervisor项目名称
supervisorctl stop supervisor项目名称

4.配置nginx

使用nginx转发websocket,方面拓展后期的负载均衡。

server {
        listen 80;
        server_name 浏览器访问的ip地址;

        location /async {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host $server_name;
            proxy_pass http://127.0.0.1:8008/async; # websocket启动端口号和路由前缀,要和项目中routing配置的路径保持一致
}

本文分享自微信公众号 - pythonista的日常(gh_fc70d5d98d3f),作者:pythonista daily

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • nginx 日志定时切割

    最近有个需求,需要查看我们官网的日活,我是打算通过查看 nginx 日志,对每条日志进行切割,过滤出 ip,然后通过 set 集合去重,查看集合 set 的长度...

    用户4945346
  • 开工之前的热身小菜(一)答案

    这道题因为要考虑有序,就是按照字符串里面的字符顺序,同时要统计字符出现的次数。高手解法1非常巧妙,里面两个类的继承,同时继承了collection 模块里面的O...

    用户4945346
  • django分页Paginator的简单使用

    之前同事在项目中写了分页的一个函数,但是并没有返回结果集的总个数和总页数。所以我就想到了用 django 自带的分页类获取分页的数据。因为要分页的对象可能是个列...

    用户4945346
  • ICML 2019 | 序列到序列自然语言生成任务超越BERT、GPT!微软提出通用预训练模型MASS

    编者按:从2018年开始,预训练(pre-train) 毫无疑问成为NLP领域最热的研究方向。借助于BERT和GPT等预训练模型,人类在多个自然语言理解任务中取...

    AI科技评论
  • 【ICML 2019】微软最新通用预训练模型MASS,超越BERT、GPT!

    从 2018 年开始,预训练(pre-train) 毫无疑问成为 NLP 领域最热的研究方向。

    新智元
  • 什么是渗透测试?

    渗透测试告诉系统上采用的现有防御措施是否足够强大,可以防止任何安全漏洞。渗透测试报告还建议了可以采取的对策,以减少系统被黑客入侵的风险。

    用户7466307
  • 深入分析Java ClassLoader原理

    大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用...

    哲洛不闹
  • 使用python操作solr

    使用Java的同学可以使用solrj操作solr,但是python就没有太好的操作solr的模块了。虽然也能找到几个,例如solrpy,但是由于年久失修,基本不...

    py3study
  • Netflix与英特尔共同发布开源编解码器SVT-AV1

    https://www.streamingmedia.com/Articles/News/Online-Video-News/NAB-19-Netflix-an...

    LiveVideoStack
  • 手把手教你创建自己的object detector

    本文译自:http://www.hackevolve.com/create-your-own-object-detector/

    DoubleV

扫码关注云+社区

领取腾讯云代金券