首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >龙卷风nginx websockets握手400错误

龙卷风nginx websockets握手400错误
EN

Stack Overflow用户
提问于 2016-03-08 10:59:23
回答 2查看 1.4K关注 0票数 2

问题在于websocket连接,由nginx在浏览器中代理从龙卷风/龙卷风-套接字到sockjs客户端。没有nginx (在本地主机上),事情就能正常工作。

加载页时(当套接字连接初始化时)浏览器中的错误消息:

代码语言:javascript
复制
WebSocket connection to 'ws://my-domain.com/ws/844/blvz89pq/websocket' failed: Error during WebSocket handshake: Unexpected response code: 400

自定义nginx配置的相关部分:

代码语言:javascript
复制
location /ws/ {
  proxy_pass         http://127.0.0.1:8888;

  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection $connection_upgrade;

  proxy_redirect     off;
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
}

来自$connection_upgrade的nginx.conf的值:

代码语言:javascript
复制
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

看起来,如果Upgrade头没有设置为'websocket' (代码),则龙卷风-套接字返回400。实际上,在第46行中,在if之前打印页眉会给出标题Connection=close的值,而根本没有给出Upgrade

dict(self.request.headers)

代码语言:javascript
复制
{
    "Accept-Language": "en-US,en;q=0.8,ru;q=0.6", 
    "Accept-Encoding": "gzip, deflate, sdch", 
    "Sec-Websocket-Key": "*******", 
    "Connection": "close", 
    "X-Real-Ip": "172.17.0.1", 
    "Origin": "http://my-domain.com", 
    "Sec-Websocket-Extensions": "permessage-deflate; client_max_window_bits", 
    "X-Forwarded-For": "172.17.0.1", 
    "Sec-Websocket-Version": "13", 
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36", 
    "Host": "my-domain.com", 
    "X-Forwarded-Proto": "http", 
    "Cookie": "_ym_uid=1456149826627418608; sessionid=0pn2knqey7raw7w4dst9d7vqvtvsmook; csrftoken=0o1lqSW4XCZvvlvYtN4S7Stt53AyKWf6; __utmx=147844469.bAGHuGeARZy_vppa6db8lg$115132382-10:5.mu9KcCiZSDepsLZ385hDXA$117448007-11:0; __utmxx=147844469.bAGHuGeARZy_vppa6db8lg$115132382-10:1456307221:15552000.mu9KcCiZSDepsLZ385hDXA$117458007-11:1457421562:15552000; _ym_isad=0; _ga=GA1.2.2002408319.1456149825; JSESSIONID=dummy", 
    "Pragma": "no-cache", 
    "Cache-Control": "no-cache"

}

但是从浏览器中检查报头显示,连接头和升级标头都有值,这对于龙卷风是有效的。

来自浏览器的标头:

代码语言:javascript
复制
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ru;q=0.6
Cache-Control:no-cache
Connection:Upgrade
Cookie:_ym_uid=1456149826627418608; sessionid=0pn2knqey7raw7w4dst9d7vqvtvsmook; __utmx=147844469.bAGHuGeARZy_vppa6db8lg$115132382-10:5.mu9KcCiZSDepsLZ385hDXA$117448007-11:0; __utmxx=147844469.bAGHuGeARZy_vppa6db8lg$115132382-10:1456307221:15552000.mu9KcCiZSDepsLZ385hDXA$117448007-11:1457421562:15552000; _ym_isad=0; _ga=GA1.2.2002408319.1456149825; csrftoken=0o1lqSW4XCZvvlvYtN4S7Stt53AyKWf6; JSESSIONID=dummy
Host:my-domain.com
Origin:http://my-domain.com
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
Sec-WebSocket-Key:/zRJijtAtPjjLNJK49SIDQ==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36

我可能的建议是“龙卷风”如何/何时解析标题。

UPD:所用软件的版本:

代码语言:javascript
复制
1. sockjs-tornado==1.0.2
2. tornado==4.3
3. tornado-redis==2.4.18
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-14 10:20:19

+1到里利亚姆 回答,但我需要加上我的5分钱,因为这个问题最近又回来了。因此,要解决这个问题,如果在nginx驱动的码头容器前面有 nginx,则需要修改主管的 nginx配置。

/etc/nginx/nginx.conf

代码语言:javascript
复制
...
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
...

/etc/nginx/conf.d/virtual-site.conf

8001 -从码头集装箱外露的港口

代码语言:javascript
复制
location / {
  proxy_pass         http://127.0.0.1:8001;

  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection $connection_upgrade;

  proxy_redirect     off;
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
}
票数 2
EN

Stack Overflow用户

发布于 2016-03-09 16:15:25

因此,问题在于通过在Docker容器外运行的Nginx代理请求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35865549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档