2013-05-14 37 views
5

nginx's website解釋我已經使用這些設置爲我的nginx來代理的WebSockets到服務器的NodeJS OK:nginx的,作爲一個的NodeJS代理+ socket.io:一切都只是大的消息

location /socket.io/ { 
    proxy_pass http://backend; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
} 

一切工作正常,socket.emit()/ socket.on()互相發送消息;直到我發送一個相當大的文本消息(26 kB的HTML)。

  • 這個大消息未被的NodeJS收到(所以我想這個問題是關於nginx的側)
  • 有關於nginx的日誌
  • 沒有錯誤一旦這個大消息已被客戶端發送, NodeJS將停止從該客戶端接收socket.io的心跳。

我在做什麼錯? 有沒有我不知道的nginx設置?

+0

你使用的是什麼版本的nginx? – 2013-05-21 02:48:17

+0

我正在使用nginx/1.4.0 – adrien 2013-05-21 08:30:12

+0

我使用你的配置時出現這個問題:'未捕獲的TypeError:無法調用方法'onClose'null' – chovy 2013-12-07 11:31:06

回答

4

找到的「解決方案」是使用haproxy拆分nginx和NodeJS之間的tcp流。

這並不是最優的,因爲它在我們的堆棧中添加了另一個程序,但它完成了這項工作。

在我看來,nginx websocket的支持還遠遠不夠生產。

0

嘗試用你的配置添加這些:

proxy_buffers 8 2m; 
proxy_buffer_size 10m; 
proxy_busy_buffers_size 10m; 

原因:proxy_buffer默認大小爲4K或8K。因此,在大消息導致緩衝區溢出後,它可能會丟棄這些連接。檢查默認設置here,以便它符合您的要求。

+0

你好,我已經嘗試過了,但它沒有改變任何東西... – adrien 2013-05-17 15:25:56

+0

相反,我會使用'proxy_buffering off'關閉代理緩衝。彗星沒有與nginx緩衝工作,我懷疑WebSockets會有這種問題。你會認爲nginx會自動禁用緩衝,或者如果需要的話,至少把它放在默認的配置中,但我想有足夠的人通過更大的緩衝區。如果你要去緩衝路線,你還應該添加像'large_client_header_buffers 8 32k;'這樣的東西。有關示例配置,請參見[本要點](https://gist.github.com/aku/5466527)。 – 2013-05-23 07:39:43