Nginx在proxy_pass之后使用Upgrade头



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

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

我大量使用wireshark来了解到底发生了什么,显然nginx正在吃掉标题"Connection:Upgrade"one_answers"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.7MySQL python==1.2.5django-redis会话==0.4.0django websocket redis==0.4.2gevent==1.0.1greenlet==0.4.4redis==2.10.3六==1.8.0uWSGI==2.0.7wsgiref==0.1.2

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

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

如果您希望能够处理流式请求/响应或其他Comet、Long轮询或Web套接字等奇特功能,您需要关闭代理缓冲。当你这样做的时候,你必须带着一个异步工作程序类的。

要关闭缓冲,只需要添加proxy_braining-off;到您的位置块:

在您的位置将是:

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中部署的指南。http://docs.gunicorn.org/en/latest/deploy.html?highlight=header

希望这能帮助

相关内容

  • 没有找到相关文章

最新更新