项目中需要一个聊天室的功能,所以需要websocket通信,选择了使用channels模块,主要记录下channels部署的配置和一些坑.

原项目是通过nginx+uwsgi部署的,这里我没做任何改动,只是通过Nginx将特定请求路径代理到daphne上.部署前对django配置的一些修改可以直接参考官方文档,这个比较简单,也没有什么问题.

supervisor + daphne

第一种:

这是我最初在网上查到配置,很多文章基本是类似的:

[program:asgi]
directory=/your/path/project-name # 项目主路径
command=daphne -b localhost -p 8001 --proxy-headers project-name.asgi:application # 启动命令
autostart=true
autorestart=true
stdout_logfile=/tmp/asgi.log
redirect_stderr=true

需要注意一点,如果项目运行在虚拟环境,supervisor安装在主环境中,那么daphne需要用绝对路径.

这种配置是可用的,但有个问题是只能单进程运行,如果打开多个进程(添加numprocs=n)会报端口占用的错误.

第二种

然后就是官方的配置,文档中提供的配置是多进程的,但有一个小问题,先贴出我的配置:

[fcgi-program:asgi]
socket=tcp://localhost:8001
directory=/my/app/path
# 区别在这里
command=daphne --fd 0 --access-log - --proxy-headers mysite.asgi:application
###########
numprocs=4
process_name=asgi%(process_num)d
autostart=true
autorestart=true
stdout_logfile=/your/log/asgi.log
redirect_stderr=true

注意:fcgi-program是做了一层代理的,现在一个网络请求的传递就是:nginx -> supervisor -> daphne -> backend-app.

所以这里daphne绑定的unix-socket或者文件描述符都是用来与supervisor通信的,这就与上面第一种配置不同了

我去掉了-u xxx/xxx.sock的配置项,因为这一项是没有必要的.在命令行中看一下daphne的帮助,里面有这样两条:



--fd FILE_DESCRIPTOR选项会绑定到一个文件描述符,并替换掉对host/port和unix-socket的绑定.

注意: 根据supervisor:fcgi-program的文档,fcgi-program中部署的程序只能通过文件描述符0与supervisor进行通信.所以这里如果只用unix-socket其实是无效的.

nginx

nginx的配置基本参考channels的文档:

upstream channels-backend {
server localhost:8001;
}
...
server {
...
location /ws/ {
proxy_pass http://channels-backend; 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;
}
...
}

(我其实没有搞懂文档里提到的try_files的用法-_-!)

我遇到的一个小问题,起初我在supervisor配置里用了127.0.0.1,然后在nginx里用了localhost,发现居然连不通,这才第一次意识到他两个是有区别的.

因为localhost的传输不走网卡,不受网卡或防火墙的限制,所以建议本地程序间通信用localhost.

django-channels的部署(supervisor+daphne+nginx)的更多相关文章

  1. 测试开发之Django——No5.Django项目的部署(CentOS7+nginx)

    配置环境:CentOS7 1.安装python3环境 默认的CentOS7系统中,会安装python2.7的版本,由于Django2.0并不支持python2.7的版本,所以我们需要自己在系统中安装p ...

  2. django+channels+dephne实现websockrt部署

    当你的django项目中使用channels增加了websocket功能的时候,在使用runserver命令启动时,既可以访问http请求,又可以访问websocket请求.但是当你使用uWSGI+n ...

  3. nginx+django线上部署

    (一):背景在线 由于现在工作的需要,我需要使用Python来进行一个网站后台的开发,python之前接触过其语法的学习,基本的东西已经掌握,但是当时自学的时候是学得python3.5,而现在要使用p ...

  4. [技术博客]ubuntu+nginx+uwsgi+Django+https的部署

    ubuntu+nginx+uwsgi+Django+https部署文档 配置机器介绍 操作系统:Ubuntu 18.04.2 LTS 64位 python版本:Python 3.6.7 Django版 ...

  5. 白手起家Django项目发布下篇_Django项目nginx部署

    上一篇完成了python的安装,接下来安装python的依赖包和项目的依赖包 1.  python-devel 命令:yum -y install python-devel 安装Django1.8.2 ...

  6. django 本地项目部署uwsgi 以及云服务器部署 uwsgi+Nginx+Docker+MySQL主从

    一 .django 本地项目部署uwsgi 1 本地部署项目 uwsgi安装测试 通过uwsgi 进行简单部署 安装uwsgi命令:pip install uwsgi -i http://pypi.d ...

  7. 【翻译】Django Channels 官方文档 -- Tutorial

    Django Channels 官方文档 https://channels.readthedocs.io/en/latest/index.html 前言: 最近课程设计需要用到 WebSocket,而 ...

  8. 实时 Django 终于来了 —— Django Channels 入门指南

    Reference: http://www.oschina.net/translate/in_deep_with_django_channels_the_future_of_real_time_app ...

  9. 【Django】 gunicorn部署纪要

    使用Gunicorn 来部署Django应用, 没有一步一步写怎么操作,简单记录下重要的点,方面以后查阅. 主要的方式还是Nginx反向代理到Gunicorn, Gunicorn wsgi来启动Dja ...

随机推荐

  1. 机器学习笔记(九)---- 集成学习(ensemble learning)【华为云技术分享】

    集成学习不是一种具体的算法,而是在机器学习中为了提升预测精度而采取的一种或多种策略.其原理是通过构建多个弱监督模型并使用一定策略得到一个更好更全面的强监督模型.集成学习简单的示例图如下: 通过训练得到 ...

  2. Python中的Tcp协议应用之TCP服务端-线程版

    利用线程实现,一个服务端同时服务多个客户端的需求. TCP服务端-线程版代码实现: import socket import threading def handle_client_socket(ne ...

  3. luogu P3984 高兴的津津

    题目描述 津津上高中了.她在自己的妈妈的魔鬼训练下,成为了一个神犇,每次参加一次OI比赛必拿Au虐全场.每次她拿到一个Au后就很高兴.假设津津不会因为其它事高兴,并且她的高兴会持续T天(包包含获奖当天 ...

  4. NSURLSession使用(整理版)

    NSURLSession使用 1.NSURLSession诞生于2013年,但其在前几年一直生活在NSURLConnection的阴影下,直到iOS9的出现,NSURLConnection被官方宣布弃 ...

  5. 一台电脑如何管理多个ssh key

    目录 一.生成ssh key 1.1 生成密钥(必须) 1.2 设置路径 (可选) 1.3 指定密语字符串(可选) 二.设置ssh key的代理 2.1. 首先查看代理 2.2. 添加私钥 三.添加公 ...

  6. golang包管理的古往今来

    https://golang.org/ before GO1.5-GOPATH 在GO1.5之前用GOPATH以及GOROOT这两个环境变量来决定包的位置. GOROOT就是告知当前go的安装位置,编 ...

  7. 统计学习方法与Python实现(二)——k近邻法

    统计学习方法与Python实现(二)——k近邻法 iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.定义 k近邻法假设给定一个训练数据集,其中的实例类别已定 ...

  8. Django异步任务线程池

    当数据库数据量很大时(百万级),许多批量数据修改请求的响应会非常慢,一些不需要即时响应的任务可以放到后台的异步线程中完成,发起异步任务的请求就可以立即响应 选择用线程池的原因是:线程比进程更为可控.不 ...

  9. 【CSS】381- 提升你的CSS选择器技巧

    我已经使用CSS多年了,但直到最近我才深入研究了一下CSS选择器. 我为什么要这样做呢?我们都知道选择器,但麻烦的是随着时间的推移,很容易习惯于在每个项目中使用相同的可信任选择器来实现你需要做的事情. ...

  10. 阿里巴巴的26款Java开源项目

    阿里巴巴的26款Java开源项目 开源展示了人类共同协作,成果分享的魅力.没有任何一家网络公司可以不使用开源技术,仅靠自身技术发展起来.“取之于开源,用之于开源,才能促进开源的良性发展”,阿里巴巴各个 ...