Django 频道 daphne 返回 200 状态码

Posted

技术标签:

【中文标题】Django 频道 daphne 返回 200 状态码【英文标题】:Django channels daphne returns 200 status code 【发布时间】:2020-01-21 14:23:42 【问题描述】:

我已经使用 nginx + uwsgi 设置了一个 Django 应用程序。该应用程序还使用带有 redis 的 django-channels。在单个机器上部署设置时,一切正常。

但是,当我尝试在 2 个实例中设置应用程序并设置通用负载平衡器来协调请求时,请求会正确路由到 daphne 进程,并且我可以看到日志。但是 daphne 进程返回的状态码是 200 而不是 101。

负载均衡器 nginx 配置:

upstream webservers 
    server 10.1.1.2;
    server 10.1.1.3;



server 
    location / 
        proxy_pass http://webservers;
    

使用的版本:

daphne==2.2.4
channels==2.1.6
channels-redis==2.3.2

所有路由工作正常,没有错误,只是返回的状态码是 200 而不是 101。

【问题讨论】:

那么你是用在http还是websocket上?消费者是否按预期工作? 我将它用于 websocket。这就是为什么我很惊讶我得到了 200 个状态码 您的消费者在工作吗? @Ken4scholars 是的,他们正在工作。当我在本地尝试或没有 nginx 负载均衡器时不会发生此问题 你是不是想多了? websocket 请求以 HTTP 请求和握手开始,之后启动协议更改。在第一个请求中获得 200 实际上可能是预期的行为。此外,正如您所说,您的消费者工作正常。你可能会被困在解决一个不存在的问题上 【参考方案1】:

尝试添加以下标题,希望这会有所帮助:


server 
    location / 
        proxy_pass http://webservers;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
   

完整的official instruction关于如何设置Django Channels + Nginx can be found here

【讨论】:

是的,行得通。谢谢。我已将其添加到应用所在的 nginx 中,但未添加到负载均衡器中。 您是否可以在这里简要介绍一下升级的作用以及为什么它很重要?

以上是关于Django 频道 daphne 返回 200 状态码的主要内容,如果未能解决你的问题,请参考以下文章

在 systemd 上使用 daphne 运行 django 频道

使用 Daphne 和 Nginx 部署 django 频道的问题

开始使用 Django 频道时遇到问题

使用 SSL 使用 Daphne + NGINX 部署 Django 通道

在负载均衡器后面运行多个 daphne 实例:django-channels

Django 频道 + Elastic Beanstalk