2016-03-08 131 views
1

問題是與websocket連接,由nginx從tornado/tornado-sockjs代理sockjs客戶端在瀏覽器中。沒有nginx(在本地主機上)的東西正常工作。在瀏覽器龍捲風nginx websockets握手400錯誤

錯誤消息,當加載頁面時(sockjs連接初始化):

WebSocket connection to 'ws://my-domain.com/ws/844/blvz89pq/websocket' failed: Error during WebSocket handshake: Unexpected response code: 400 

定製的相關部分nginx的配置:$ connection_upgrade的

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; 
} 

值從nginx.conf:

map $http_upgrade $connection_upgrade { 
     default upgrade; 
     ''  close; 
    } 

看起來像tornado-sockjs返回400的情況下,如果Upgrade標題未設置爲'websocket'code)。事實上,在第46行的if之前打印標題給我們提供了標題Connection=close的值和根本不存在的Upgrade

價值dict(self.request.headers)

{ 
    "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" 

} 

但是,從瀏覽器檢查頭顯示,這兩個連接和升級頭有價值觀,這應該是有效的龍捲風。從瀏覽器

頁眉:

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:軟件 版本中使用:

1. sockjs-tornado==1.0.2 
2. tornado==4.3 
3. tornado-redis==2.4.18 

回答

1

+1到Riliamanswer,但我需要補充我的5美分,因爲這個問題最近回來了。 所以要解決這個問題,如果你有首席 nginx在nginx的docker容器前,你需要修改你的首席的 nginx配置。

/etc/nginx/nginx.conf

... 
map $http_upgrade $connection_upgrade { 
    default upgrade; 
    ''  close; 
} 
... 

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

8001 - 端口從搬運工容器暴露

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; 
} 
0

所以這個問題是通過泊塢窗容器的一個更Nginx的運行之外的代理請求。