【发布时间】: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