Django Channels Daphne 返回 200 状态码

5
我已经使用Nginx + uwsgi部署了一个Django应用程序,并且该应用程序还使用redis的django-channels组件。将该设置部署到单个机器上时,一切都正常。
但是,当我尝试在两个实例中设置应用程序并设置一个共同的负载均衡器来协调请求时,请求会被正确路由到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?使用者正常工作了吗? - Ken4scholars
我正在使用它进行WebSocket通信。这就是为什么我感到惊讶,因为我收到了200状态码。 - Aswin Murugesh
你的消费者正在工作吗? - Ken4scholars
@Ken4scholars 是的,它们正在工作。当我在本地尝试或没有使用nginx负载均衡器时,就不会出现这个问题。 - Aswin Murugesh
你是不是想太多了?WebSocket请求始于HTTP请求和握手,之后启动协议更改。在第一个请求中获得200实际上可能是一种预期行为。而且,正如你所说,你的消费者正在正确地工作。你可能被困在解决不存在的问题上了。 - Ken4scholars
@Ken4scholars 浏览器尝试初始化套接字连接,当它收到200响应时会抛出错误。问题在于Websockets不应该收到200。 - Aswin Murugesh
1个回答

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

server {
    location / {
        proxy_pass http://webservers;

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

关于如何设置Django Channels + Nginx的完整官方说明可以在这里找到链接


2
是的,那个可行。谢谢。我已经将它添加到了应用所在的nginx中,但没有添加到负载均衡器中。 - Aswin Murugesh
你能否简要介绍一下升级的作用以及为什么在这里很重要吗? - Aswin Murugesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接