2013-05-03 379 views
1

我正在使用nginx 1.4.0,它可以很好地處理較新的WebSocket版本,但草案76是一個問題。我的後端(基於Netty中的Java應用程序)似乎並沒有收到握手請求,並且在Nginx的錯誤日誌我Nginx:反向代理WebSocket草案76

[error] 7662#0: *3720 upstream timed out (110: Connection timed out) while reading response header from upstream 

我的配置($ proxy_add_connection以同樣的方式描述there

include proxy_params; 
proxy_pass http://127.0.0.1:8001/; 
proxy_http_version 1.1; 
proxy_set_header Connection $proxy_add_connection; 
proxy_set_header Upgrade $http_upgrade; 

如果我直接連接到後端,它工作正常。

有什麼我可以做的,以解決它?

回答

3

Nginx最近對支持WebSocket代理的更改不支持WebSocket本身,而是允許它識別將連接從HTTP升級到另一個協議的請求。當它得到這樣的請求時,它現在建立到後端的隧道,而不是將連接丟棄爲無效。 RFC6455 WebSocket握手是一種標準的HTTP協議升級請求,因此它適用於這種新功能。

76/00 WebSocket握手草案是專門爲打破沒有明確支持WebSocket的中介而設計的。正如Nginx所做的那樣是代理升級後的TCP連接,它實際上並不理解WebSocket握手或正在使用的WebSocket的協議版本。因此,它無法執行76/00握手草案要求的非HTTP調整。

爲了支持WebSocket的76/00版本,Nginx必須實現特殊的草稿76/00檢測和處理邏輯。鑑於添加非HTTP邏輯的複雜性以及76/00草案未完成的質量和可疑的安全性,代理中介機構不太可能支持它。

如果您的用戶完全依賴2 - 3年前版本的Chrome/Safari,則Flash後備或原始TCP負載平衡可能是您最好的選擇。