You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

django-channels部署后WebSocket连接返回404 page not found问题咨询

问题排查及修复方案
  • Nginx配置缺失WebSocket升级映射规则

你当前nginx.conf中使用了$connection_upgrade变量但未提前定义,导致WebSocket协议升级请求无法被正确识别,会被当作普通HTTP请求转发到后端。普通Django HTTP路由中没有匹配/ws/mark/的路径,就会返回404。
修复方式:在nginx.conf的http块内、server块外添加如下映射配置:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
  • 启动脚本进程阻塞问题

你提供的runner.sh中daphne命令为前台运行,会阻塞后续runworker命令的执行,导致Channels工作进程没有启动,无法处理WebSocket请求。
修复方式:修改runner.sh将daphne改为后台运行:

#!/bin/sh
daphne -b 0.0.0.0 -p 8000 config.asgi:application  -v2 &
python manage.py runworker -v2

生产环境建议使用supervisor等进程管理工具维护多进程。

  • ALLOWED_HOSTS配置缺失

从日志可见你的ALLOWED_HOSTS默认是空数组,若DEBUG=False时,你访问服务使用的IP未加入ALLOWED_HOSTS列表,Django会直接返回404/400错误。
修复方式:在.env中配置ALLOWED_HOSTS为你访问时使用的IP,测试环境可临时设为["*"]。

  • 路由文件路径校验

确认你的routing.py文件存放于config目录下,和asgi.py同级,否则from config.routing import websocket_urlpatterns会导入失败,导致WebSocket路由未注册。

  • 补充配置建议(非404直接原因)

你当前asgi.py中WebSocket路由没有包裹AuthMiddlewareStack,如果你的Consumer需要使用Django登录态会报错,建议修改为:

application = ProtocolTypeRouter({
    "http": django_asgi_app,
    "websocket": AuthMiddlewareStack(
        URLRouter(websocket_urlpatterns)
    ),
})

另外请确认docker-compose中backend配置的/boot.sh就是你提供的启动脚本,避免启动命令不匹配的问题。

内容的提问来源于stack exchange,提问作者Dima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:36:03