Django Nginx在代理通过后使用升级头
所以我已经用头撞墙两天了,请帮忙 我正在尝试使用此方法建立Websocket连接 配置 有两个uwsgi运行实例,一个用于网站,另一个用于websocket通信 我大量使用wireshark来了解到底发生了什么,显然nginx正在吃掉标题“Connection:Upgrade”和“Upgrade:websocket” 以下是关键的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
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,我深表歉意,但有一个示例说明如何执行此操作,并且确实有效。我想知道上述解决方案是否使用了
“升级”
,而不是“升级”
如文档所示?希望这能帮助其他人。