Docker部署Django Channels+Nginx代理:WebSocket连接失败求助
Django Channels + Docker部署WebSocket连接失败排查修复
问题概述
使用Docker部署Django Channels,通过Daphne提供服务,应用启动正常,但WebSocket地址HTTPS://EXAMPLE.COM/WS/SOCK无法连接,其余HTTP路由可正常访问。
现有配置文件
asgi.py
application = ProtocolTypeRouter({ 'http': django_asgi_app, 'websocket': AllowedHostsOriginValidator( AuthMiddlewareStack( URLRouter(websocket_urlpatterns) ))})
Dockerfile
FROM python:3.8 ENV PYTHONUNBUFFERED 1 WORKDIR /myproject ADD . /myroject RUN pip install -r /myprjoect/requirements.txt EXPOSE 8000 CMD ["daphne", "-b", "0.0.0.0", "-p", "8000", "myproject.asgi:application"]
nginx.conf
location / { proxy_set_header Host $http_host; proxy_set_header X-Forward-Proto https; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8443/; } #path to proxy my WebSocket requests location /ws/ { proxy_pass http://localhost:8443; 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; }
docker-compose.yml
version: "3.8" services: myservice: image: myimage container_name: my_container ports: - 8443:8000
问题排查与修复
1. Dockerfile路径错误
Dockerfile存在两处拼写错误,会导致代码复制不完整或依赖安装失败:
ADD . /myroject→ 修改为ADD . /myprojectRUN pip install -r /myprjoect/requirements.txt→ 修改为RUN pip install -r /myproject/requirements.txt
2. Nginx配置核心修复
WebSocket代理配置有3个关键问题:
- 代理路径缺失斜杠:
proxy_pass http://localhost:8443改为proxy_pass http://localhost:8443/,否则/ws/sock会被转发为/sock,导致路由匹配失败。 - 中文引号错误:
proxy_set_header Connection “upgrade”;中的中文引号替换为英文引号"upgrade",否则Nginx无法识别该配置项。 - 补充HTTPS转发头:添加
proxy_set_header X-Forwarded-Proto https;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;,确保Daphne识别请求协议与来源IP。 - 增加长连接超时:添加
proxy_read_timeout 86400;,避免WebSocket长连接被过早断开。
修复后的Nginx WebSocket配置:
location /ws/ { proxy_pass http://localhost:8443/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_redirect off; proxy_read_timeout 86400; }
3. Django配置补充
- 确保
settings.py的ALLOWED_HOSTS包含EXAMPLE.COM,否则AllowedHostsOriginValidator会拦截WebSocket请求。 - 检查
websocket_urlpatterns是否正确配置了/ws/sock/路由,确保与前端请求路径完全匹配。
4. 验证步骤
- 用浏览器开发者工具查看Network面板的WebSocket请求,检查返回状态码:404代表路由不匹配,403代表Origin或权限验证失败。
- 进入容器执行
pip list,确认Channels、Daphne依赖已正确安装。 - 查看Daphne日志,确认WebSocket请求是否到达服务端。
内容的提问来源于stack exchange,提问作者Rotxa
相关产品推荐
相关产品推荐

