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

Windows服务器Apache配置Django Channels安全WebSocket(wss)连接求助

我来帮你一步步排查Windows Apache下配置Django Channels安全WebSocket(WSS)的问题,结合你给出的配置和报错信息,咱们从几个核心方向入手:

一、先解决证书名称不匹配的基础问题

证书不匹配会直接影响SSL握手,也是浏览器和服务端日志警告的根源:

  • 你当前用IP 10.66.88.87 访问,但SSL证书是绑定域名 test.company.com 的,两者不匹配必然触发警告。解决办法二选一:
    1. 重新申请包含该IP的SSL证书(添加IP到证书的SAN扩展字段);
    2. 在本地hosts文件中添加 10.66.88.87 test.company.com 映射,之后用域名 wss://test.company.com:8080/ws/home/ 发起WebSocket请求,让证书域名和访问地址匹配。
  • 检查 httpd-ssl.conf 里的默认443虚拟主机,它可能和你自定义的8080 SSL虚拟主机冲突,建议暂时注释掉默认的443配置块,避免干扰。
二、修正Apache的WSS代理配置(核心解决404报错)

你的Proxy配置逻辑错误,这是导致WebSocket握手404的关键:

  • 当前配置 ProxyPass /wss/ ws://10.66.88.87:8080 等于把请求又转发回了Apache自己的8080端口,而Django Channels的ASGI服务应该运行在独立端口(比如8001)。
  • 先确保ASGI服务正常启动:在项目根目录执行命令
    daphne -b 10.66.88.87 -p 8001 django_project.asgi:application
    
  • 然后修改 httpd-vhost.conf 中的代理配置:
    ProxyRequests Off
    # 把前端请求的/wss路径转发到ASGI服务的ws端口
    ProxyPass /ws/ ws://10.66.88.87:8001/ws/
    ProxyPassReverse /ws/ ws://10.66.88.87:8001/ws/
    
    注意:前端请求的是 /ws/home/,所以代理路径要对应 /ws/,Apache会自动把HTTPS的WSS请求转换成HTTP的WS请求转发给ASGI服务。
三、检查Django Channels的内部配置
  • 确认 settings.py 中Channels配置正确:
    INSTALLED_APPS = [
        # ... 其他已有APP
        'channels',
    ]
    ASGI_APPLICATION = 'django_project.asgi.application'
    CHANNEL_LAYERS = {
        "default": {
            "BACKEND": "channels.layers.InMemoryChannelLayer"  # 测试环境用,生产建议换Redis
        },
    }
    
  • 检查 asgi.py 是否正确挂载WebSocket路由:
    import os
    from django.core.asgi import get_asgi_application
    from channels.routing import ProtocolTypeRouter, URLRouter
    from app.routing import websocket_urlpatterns  # 替换成你实际的websocket路由文件
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
    
    application = ProtocolTypeRouter({
        "http": get_asgi_application(),
        "websocket": URLRouter(websocket_urlpatterns),
    })
    
  • 验证你的 routing.py 中是否存在 /ws/home/ 的路由规则,确保路径匹配,否则即使代理通了也会返回404。
四、日志排查技巧
  • 查看Apache的 error.log,重点关注SSL握手失败、代理转发失败的详细错误信息;
  • 查看Django项目日志,确认ASGI服务是否收到了请求:如果没收到,说明Apache代理配置有问题;如果收到但返回404,说明Channels路由配置错误;
  • 用Chrome开发者工具的Network标签,查看WebSocket请求的Request/Response Headers,确认Upgrade: websocket等关键头是否被正确转发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:31:21