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

Heroku部署的Django应用Channels实时聊天WebSocket连接失败排查

问题排查与修复方案

1. Channel Layer配置错误

当前使用的channels.layers.InMemoryChannelLayer仅适用于本地单进程开发场景,完全不支持生产环境:Heroku的web进程会多实例运行、且进程重启后内存数据全部清空,同时内存型Channel Layer本身不支持跨进程的WebSocket通信,这是聊天功能失效的核心原因。
修复方案:替换为Redis Channel Layer,你已经安装了channels-redis依赖,首先在Heroku后台开通Heroku Redis或Redis To Go插件,获取Redis连接地址(会自动写入环境变量REDIS_URL),再修改settings.py的CHANNEL_LAYERS配置:

import os
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [os.environ.get("REDIS_URL", "redis://localhost:6379")],
        },
    },
}

2. Procfile启动命令错误

当前配置用gunicorn启动WSGI应用,无法处理WebSocket请求,你已经安装了ASGI服务器daphne,直接修改Procfile内容为:

web: daphne reddix.asgi:application --port $PORT --bind 0.0.0.0 -v2

Channels的ASGI应用本身兼容处理普通HTTP请求,无需额外保留原来的WSGI启动配置。

3. 补充检查项

如果修改完上述配置后仍有报错,检查项目根目录下的asgi.py文件,确认已经配置为Channels的ASGI路由规则,示例如下:

import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
# 替换为你自己项目的聊天路由导入路径
import chat.routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'reddix.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AuthMiddlewareStack(
        URLRouter(chat.routing.websocket_urlpatterns)
    ),
})

所有配置修改完成后重新部署即可,前端WebSocket连接地址统一使用wss://开头适配Heroku的HTTPS环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:36:04