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

