Azure App Service部署Django应用WebSocket连接问题排查
确认Azure App Service的WebSocket开关已启用
登录Azure门户,进入你的App Service -> 设置 -> 配置 -> 常规设置,找到WebSocket选项,确保设置为启用。这是Azure App Service支持WebSocket的核心前提,默认可能处于关闭状态。检查ASGI配置与启动命令
Django Channels依赖ASGI而非WSGI,部署时必须使用ASGI服务器(如Daphne):- 确保项目根目录下的
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 ) ), }) - 在Azure App Service的配置 -> 常规设置中,将启动命令设置为:
(替换daphne your_project.asgi:application --port 8000 --bind 0.0.0.0your_project为实际项目名称)
- 确保项目根目录下的
修正Redis Channel Layer的SSL配置
Azure Redis缓存默认强制要求SSL连接,你的当前配置使用非SSL的redis://协议和6379端口,会导致连接失败:
修改CHANNEL_LAYERS配置为:CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': { 'hosts': [('rediss://:{password}@{hostname}:6380'.format( password=myPassword, hostname=myHostname, ))], # 可选:添加超时配置避免连接超时 'socket_connect_timeout': 30, 'socket_timeout': 30, }, }, }注意:使用
rediss://协议,端口改为Azure Redis的SSL专用端口6380(非SSL端口6379在Azure中默认关闭)。验证前端WebSocket连接地址
前端必须使用wss://<你的App Service域名>/<ws路径>格式,示例:const socket = new WebSocket('wss://yourapp.azurewebsites.net/ws/chat/');禁止使用自定义端口(Azure仅开放80/443),所有WebSocket流量由App Service反向代理处理。
排查Azure日志中的错误信息
进入App Service -> 监控 -> 日志流,查看实时日志:- 检查是否有Redis连接失败的错误(如认证失败、SSL握手错误)
- 确认ASGI服务器是否正常启动,是否存在路由匹配错误
- 查看WebSocket握手阶段的HTTP错误码(如404、500)
确认Azure Redis的防火墙规则
进入Azure Redis缓存 -> 安全性 -> 防火墙和虚拟网络,确保已将App Service的出站IP地址加入允许列表,测试阶段可临时设置为“允许所有网络”以排除防火墙干扰。
内容的提问来源于stack exchange,提问作者Super MaxLv4

