使用daphne部署django channles websocket 项目

一、概述

在上一篇文章中,链接如下:https://www.cnblogs.com/xiao987334176/p/14361893.html

开发了一个django channles websocket 项目,用的是asgi。官方推荐使用asgi服务器daphne,来处理websocket请求

daphne

Daphne 是一个纯Python编写的应用于UNIX环境的由Django项目维护的ASGI服务器。它扮演着ASGI参考服务器的角色。

安装 Daphne

你可以通过 pip 来安装 Daphne

python -m pip install daphne

在 Daphne 中运行 Django

一旦 Daphne 安装完毕,你就可以使用 daphne 命令了,它将用来启动 Daphne 服务进程。在最简单的情形下,Daphne 加上包含一个 ASGI 应用模块的位置和应用的名称(以冒号分隔)。

对于一个典型的 Django 项目,可以像下面这样来启动 Daphne

daphne myproject.asgi:application

它将开启一个进程,监听 127.0.0.1:8000。这需要你的项目位于 Python path 上。为了确保这点,你应该在与 manage.py 文件相同的路径中运行这个命令。

如果需要更改运行端口,使用以下命令:

daphne myproject.asgi:application -b 0.0.0.0 -p 8000

说明:

-b 监听地址

-p 监控端口

二、实际项目运行

在上一篇文章中,链接如下:https://www.cnblogs.com/xiao987334176/p/14361893.html

已经开发好了,但是直接使用daphne运行,会遇到以下错误:

比如1:

django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

比如2:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

解决方法

修改asgi.py,增加django.setup()

import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'websocket_demo.settings')
django.setup()

from channels.auth import AuthMiddlewareStack
from django.core.asgi import get_asgi_application
# Import other Channels classes and consumers here.
from channels.routing import ProtocolTypeRouter, URLRouter
# from apps.websocket_app.urls import websocket_urlpatterns
from websocket_demo.urls import websocket_urlpatterns

# application = get_asgi_application()
application = ProtocolTypeRouter({
    # Explicitly set 'http' key using Django's ASGI application.
    "http": get_asgi_application(),
    'websocket': AuthMiddlewareStack(
        URLRouter(
            websocket_urlpatterns
        )
    ),
})

注意:django.setup()要置顶,不能在底部,否则使用daphne启动会报上面的错误。

运行项目

注意:要在manage.py同级目录下执行此命令

daphne websocket_demo.asgi:application -b 0.0.0.0 -p 8000

三、nginx+daphne+supervise

官方文档:https://channels.readthedocs.io/en/stable/deploying.html#configuring-the-asgi-application

根据官方文档,推荐使用nginx+daphne+supervise

环境说明

操作系统:centos 7.5

ip地址:192.168.31.165

supervise

yum install -y supervisor

生成配置文件

echo_supervisord_conf > /etc/supervisord.conf

修改配置文件/etc/supervisord.conf,最后一行增加

[include]
files = supervisord.d/*.ini

表示配置文件读取supervisord.d目录下所有后缀为.ini的文件。

创建配置目录,并创建配置文件

mkdir /etc/supervisord.d/vi /etc/supervisord.d/asgi.ini

内容如下:

[fcgi-program:asgi]
# TCP socket used by Nginx backend upstream
socket=tcp://localhost:8000

# Directory where your site's project files are located
directory=/tmp/internal_tools

# Each process needs to have a separate socket file, so we use process_num
# Make sure to update "mysite.asgi" to match your project name
command=/virtualenvs/venv1/bin/daphne -u /run/daphne/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers internal_tools.asgi:application

# Number of processes to startup, roughly the number of CPUs you have
numprocs=4

# Give each process a unique name so they can be told apart
process_name=asgi%(process_num)d

# Automatically start and recover processes
autostart=true
autorestart=true

# Choose where you want your log to go
stdout_logfile=/var/log/asgi.log
redirect_stderr=true

注意:红色部分,请根据实际情况修改。

启动supervisord

supervisord -c /etc/supervisord.conf

查看asgi运行状态

# supervisorctl 
asgi:asgi0                       RUNNING   pid 17567, uptime 0:00:04
asgi:asgi1                       RUNNING   pid 17566, uptime 0:00:04
asgi:asgi2                       RUNNING   pid 17569, uptime 0:00:04
asgi:asgi3                       RUNNING   pid 17568, uptime 0:00:04

可以看到,有4个进程。如果状态不是RUNNING,请查看ini配置文件,是否正常。

nginx

nginx安装就很简单了,一条命令解决

yum install -y nginx

修改虚拟配置文件/etc/nginx/conf.d/asgi.conf

upstream channels-backend {
    server localhost:8000;
}
server {
    listen 8093;    
    location / {
        try_files $uri @proxy_to_app;
    }
    location @proxy_to_app {
        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;
    }
}

注意红色部分,upstream 是asgi的监听端口。在server里面的8093是对外端口,也可以改成别的,根据实际情况而定。

最后加载nginx配置文件

nginx -s reload

扩展

如果是前后端分离架构,在vue代码中,配置nginx的服务器地址即可,比如:

Vue.prototype.$apihost = " 
Vue.prototype.$websockethost = "ws://192.168.31.165:8093"

注意:daphne不光可以处理asgi,它也可以处理wsgi,没有必要部署uswgi来处理wsgi了。

总之:nginx+daphne+supervise就可以处理django的所有功能了。

本文参考链接:

https://stackoverflow.com/questions/53683806/django-apps-arent-loaded-yet-when-using-asgi

https://docs.djangoproject.com/zh-hans/3.1/howto/deployment/asgi/daphne/

https://blog.csdn.net/qq_41854273/article/details/89332836

https://www.cnblogs.com/chenjw-note/p/12516097.html

原文地址:https://cloud.tencent.com/developer/article/1807566

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340