【问题标题】:Nginx consumes Upgrade header after proxy_passNginx 在 proxy_pass 之后使用 Upgrade 标头
【发布时间】:2014-11-28 19:11:50
【问题描述】:

所以这两天的大部分时间里我一直在用头撞墙,请帮忙。

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

我大量使用wireshark来找出到底发生了什么,显然nginx正在吃标题“连接:升级”和“升级: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;
}

正如您在这 2 个screenshots 上看到的,内部通信的 tcpdump 表明握手效果很好。但在我的浏览器(第二张图片)中,标题丢失了。

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

版本:

nginx - 1.7.4
uwsgi - 2.0.7

点冻结: 姜戈==1.7 MySQL-python==1.2.5 django-redis-sessions==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

【问题讨论】:

  • 不在我的笔记本电脑附近,但您尝试过将连接升级放在位置块之外吗?
  • 只有当请求是在 websocket 地址 (domain/ws/[facility-params]) 上发出时,才应设置标头 Connection: Upgrade。请解释一下您希望标头在位置块之外做什么。
  • 你说这整个 worker 只用于 websocket?
  • 抱歉忘了我说了什么。认为我完全误解了你的问题
  • 这是代理的默认行为。 “Connection”标头表示需要在下一环中移除的其他标头,并且由于代理是环,它移除指示的标头,即“升级”。避免这种情况的一种方法是使用 WSS://(基于 SSL 的 websocket)。不幸的是,我不知道如何将 ngix 配置为不这样做,请随时通知我们。

标签: django nginx websocket uwsgi


【解决方案1】:

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

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

如果您希望能够处理流式传输请求/响应或其他 Comet、Long polling 或 Web 套接字等花哨的功能,您需要 关闭代理缓冲。当你这样做时,你必须运行一个 的异步工作者类。

要关闭缓冲,只需要加上proxy_buffering 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;
}

在 nginx 中部署 gunicorn 的指南的链接。 http://docs.gunicorn.org/en/latest/deploy.html?highlight=header

希望对你有帮助

【讨论】:

  • 谢谢,我会试试的。
  • 不幸的是,标题仍然被丢弃。 WSS 是要走的路。
  • 为死灵道歉,但official documentation 有一个关于如何执行此操作的示例并且它确实有效。我想知道上面的解决方案是否有"Upgrade" 而不是文档中的"upgrade"?希望这对其他人有帮助。
猜你喜欢
  • 2013-11-03
  • 2014-12-13
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2018-10-30
  • 2013-01-08
  • 2012-10-02
  • 2023-03-12
相关资源
最近更新 更多