Windows服务器Apache配置Django Channels安全WebSocket(wss)连接求助
我来帮你一步步排查Windows Apache下配置Django Channels安全WebSocket(WSS)的问题,结合你给出的配置和报错信息,咱们从几个核心方向入手:
一、先解决证书名称不匹配的基础问题
证书不匹配会直接影响SSL握手,也是浏览器和服务端日志警告的根源:
- 你当前用IP
10.66.88.87访问,但SSL证书是绑定域名test.company.com的,两者不匹配必然触发警告。解决办法二选一:- 重新申请包含该IP的SSL证书(添加IP到证书的SAN扩展字段);
- 在本地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
相关产品推荐
相关产品推荐

