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

如何用Apache与Daphne部署Django Channels?WebSocket连接403错误求助

解决Apache转发WebSocket到Daphne时的403错误

从你的描述来看,不管Daphne是否运行都返回403,说明WebSocket请求根本没被转发到Daphne,而是落到了Django的WSGI应用上——而WSGI协议不支持WebSocket,所以返回403。下面是具体的排查和修复步骤:

1. 确保Apache启用了必要的代理模块

要转发WebSocket请求,Apache需要mod_proxy、mod_proxy_wstunnel和mod_rewrite模块。你可以通过以下命令启用它们:

sudo a2enmod proxy proxy_wstunnel rewrite
sudo systemctl restart apache2

2. 修正Apache的Rewrite规则

你的现有Rewrite规则存在两个关键问题:

  • Connection请求头通常不是单纯的Upgrade,而是类似keep-alive, Upgrade,精确匹配^Upgrade$会导致匹配失败
  • 规则匹配所有请求,可能引发不必要的转发冲突

修改后的Rewrite规则应该更精准:

RewriteEngine on
# 匹配WebSocket升级请求
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} ^.*Upgrade.*$ [NC]
# 只转发/ws/开头的WebSocket请求到Daphne
RewriteRule ^/ws/(.*)$ ws://127.0.0.1:8001/ws/$1 [P,QSA,L]

同时,建议在VirtualHost中明确禁用正向代理(默认关闭,但明确设置更安全):

ProxyRequests Off

3. 修正Channels的Redis通道层配置

你的settings.py里CHANNEL_LAYERS的Redis端口写错了!8001是Daphne的监听端口,Redis默认端口是6379,修正后:

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('127.0.0.1', 6379)],  # 改为Redis的默认端口(自定义端口请替换)
        },
    },
}

4. 验证配置并重启服务

完成以上修改后:

  1. 重启Apache:sudo systemctl restart apache2
  2. 重启Daphne:daphne -p 8001 mock.asgi:application
  3. 再次测试WebSocket连接

如果问题仍存在,可以查看Apache的错误日志(${APACHE_LOG_DIR}/error.log)排查细节——比如出现proxy: No protocol handler was valid的错误,说明mod_proxy_wstunnel模块未正确启用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:07:45