2014-10-29 125 views
1

我在配置nginx代理websockets時遇到了一些麻煩。我有一個node.js應用程序,它使用socket.io v0.9.16監聽端口9090上的連接,監聽端口9000上的nginx v1.6.2,並且(據說)配置爲將請求代理到我的node.js應用程序中。 nginx的配置如下:nginx配置socket.io/websockets

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

server { 
    listen 9000; 
    server_name mysite.com; 
    location/{ 
      root /var/www/mysite/web; 
    } 
    location /socket.io/ { 
     proxy_pass http://localhost:9090; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection $connection_upgrade; 
    } 
} 

我敢肯定的問題是與nginx的,因爲如果我直接訪問我的節點的應用程序端口9090,然後在兩者的/var/www/mysite/web靜態內容和WebSockets的做工精細,但如果我嘗試通過端口9000上的nginx,然後只有靜態內容得到正確的服務。

Chrome開發工具顯示,socket.io(http://my.ip.add.ress:9000/socket.io/1/?t=1414606847141)的初始請求被瀏覽器取消(我試過Firefox和Safari,結果類似)。

這可能是一個安全問題?瀏覽器是否「知道」socket.io在端口9090上運行並拒絕通過9000連接它?我很難過,任何幫助將不勝感激。

回答

0

好的,我弄明白了。問題是,在我的客戶端代碼,我連接到服務器使用的IP地址,而不是主機名:

io.connect('http://my.ip.add.ress') 

所以socket.io請求並沒有被nginx的配置相匹配,改變了上面一行用'mysite.com'主機名解決了它。

0

由於您使用的是websockets/socket.io,因此您應該使用ip_hash。

upstream project { ip_hash; server 127.0.0.2:4000; server 127.0.0.3:4000; }

+0

確實ip_hash提供任何好處,如果你沒有負載均衡?我只在1臺服務器上運行我的應用程序 – codebox 2014-10-30 11:09:18

+0

是的,客戶端可以連接到不同的服務器上,並且每當一臺服務器出現故障時,您就可以在不加載靜態內容的情況下向下一臺服務器發送消息。 – Darkerz 2014-10-30 11:16:40