Django Nginx在代理通过后使用升级头

Django Nginx在代理通过后使用升级头,django,nginx,websocket,uwsgi,Django,Nginx,Websocket,Uwsgi,所以我已经用头撞墙两天了,请帮忙 我正在尝试使用此方法建立Websocket连接 配置 有两个uwsgi运行实例,一个用于网站,另一个用于websocket通信 我大量使用wireshark来了解到底发生了什么,显然nginx正在吃掉标题“Connection:Upgrade”和“Upgrade:websocket” 以下是关键的nginx配置部分: upstream websocket { server 127.0.0.1:9868; } location /ws/ { pr

所以我已经用头撞墙两天了,请帮忙

我正在尝试使用此方法建立Websocket连接 配置 有两个uwsgi运行实例,一个用于网站,另一个用于websocket通信

我大量使用wireshark来了解到底发生了什么,显然nginx正在吃掉标题“Connection:Upgrade”和“Upgrade:websocket”

以下是关键的nginx配置部分:

upstream websocket {
    server 127.0.0.1:9868;
}

location /ws/ {
    proxy_pass_request_headers      on;
    access_log off;
    proxy_http_version 1.1;
    proxy_pass http://websocket;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Upgrade websocket;
}
正如您在这两个例子中看到的,内部通信的tcpdump表明握手工作得很好。但是在我的浏览器(第二张图片)中缺少标题

非常感谢您的任何想法。我真的被困在这里了:(

版本:

nginx - 1.7.4
uwsgi - 2.0.7
pip冻结: Django==1.7 MySQL python==1.2.5 django redis会话==0.4.0 django websocket redis==0.4.2 gevent==1.0.1 格林莱特==0.4.4 redis==2.10.3 六=1.8.0 uWSGI==2.0.7
wsgiref==0.1.2

我会使用gunicorn部署django应用程序,但无论如何

我记得我在gunicorn文档上看到过:

如果您希望能够处理流式处理请求/响应或其他 像Comet、长轮询或Web套接字之类的奇特功能,您需要 关闭代理缓冲。执行此操作时,必须使用代理缓冲运行 异步工作类的

要关闭缓冲,只需将代理缓冲添加到 您的位置块:

在您的位置将是:

location /ws/ {
    proxy_pass_request_headers      on;
    access_log off;
    proxy_http_version 1.1;
    proxy_redirect off;
    proxy_buffering off;
    proxy_pass http://websocket;
    proxy_set_header Connection "upgrade";
    proxy_set_header Upgrade websocket;
}
链接到gunicorn在nginx中部署的指南。


希望这有帮助

不要靠近我的笔记本电脑,但您是否尝试将连接升级放在位置块之外?只有在websocket地址(域/ws/[facility params])上发出请求时,才应设置头连接:升级。请稍微解释一下您希望标头在位置块之外执行的操作。您说过整个worker仅用于websocket?抱歉,忘记了我所说的。我想我完全误解了您的问题,这是代理的默认行为。“连接”header表示需要在下一个hoop中删除的其他头,由于代理是hoop,它会删除指示的头,即“升级”。避免这种情况的一种方法是使用WSS://(websocket over SSL)。不幸的是,我不知道如何将ngix配置为不执行此操作,请与我们保持联系。谢谢,我将尝试此操作。不幸的是,标题仍被删除。WSS是一个解决方案。对于necro,我深表歉意,但有一个示例说明如何执行此操作,并且确实有效。我想知道上述解决方案是否使用了
“升级”
,而不是
“升级”
如文档所示?希望这能帮助其他人。