使用FASTCGI在IIS部署Django Channels应用时WSS出现404错误
解决IIS部署Django Channels时WSS 404问题
1. 先确认IIS开了WebSocket协议
- 打开服务器管理器→添加角色和功能→找到Web服务器(IIS)→应用程序开发,勾选WebSocket协议,安装后重启IIS。
- IIS默认没开启WebSocket,不打开的话WSS请求根本没法被正确处理。
2. 检查URL重写规则是否漏了WSS路径
IIS部署Django靠URL重写转发请求,得保证/ws/开头的WSS请求被正确转到ASGI服务器:
- 打开站点的URL重写模块,加一条规则:
- 匹配URL模式:
^ws/(.*) - 动作类型选重写
- 重写URL填
http://localhost:8000/ws/{R:1}(8000换成你ASGI服务器的监听端口,比如Daphne的端口) - 把这条规则的优先级调得比静态文件、WSGI转发规则高,别让WSS请求被错发到不处理WebSocket的WSGI应用。
- 匹配URL模式:
3. 验证ASGI服务器能处理WebSocket请求
- 不管用Daphne还是Uvicorn,启动命令要绑定正确的地址和端口,比如:
必须绑定daphne -b 0.0.0.0 -p 8000 your_project.asgi:application0.0.0.0不能只绑127.0.0.1,不然IIS没法转发请求过来。 - 本地直接测
ws://localhost:8000/ws/start-quiz/,能连上说明ASGI层面没问题;连不上就去查Channels的路由配置。
4. 核对Channels路由配置
确保routing.py里有/ws/start-quiz/的路由:
# routing.py from django.urls import re_path from . import consumers websocket_urlpatterns = [ re_path(r'ws/start-quiz/$', consumers.YourConsumer.as_asgi()), ]
再确认asgi.py正确导入了这个路由:
# asgi.py import os from django.core.asgi import get_asgi_application from channels.routing import ProtocolTypeRouter, URLRouter from channels.auth import AuthMiddlewareStack import your_app.routing os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings') application = ProtocolTypeRouter({ "http": get_asgi_application(), "websocket": AuthMiddlewareStack( URLRouter( your_app.routing.websocket_urlpatterns ) ), })
5. Memurai与Channels的兼容性检查
用Memurai替代Redis,虽然兼容Redis协议,但要确认:
- Memurai服务在运行,端口是配置里的6370,本地访问的话注意防火墙别拦截。
- 用
memurai-cli ping测试,返回PONG说明服务正常。 - 如果Memurai设了密码,要在
CHANNEL_LAYERS的CONFIG里加"password": "你的密码"。
6. 排查日志找细节
- 看IIS日志(默认在
C:\inetpub\logs\LogFiles),找到WSS请求的记录,看404的具体原因,比如是不是转发到了错误的后端。 - 看ASGI服务器的日志,有没有WSS请求进来:没进来就是IIS转发规则有问题;进来了但返回404,就是路由不匹配或者消费者配置错了。
内容的提问来源于stack exchange,提问作者Simple Sarfi
相关产品推荐
相关产品推荐

