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

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 . /myproject
  • RUN 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:20:48