2012-04-09 97 views
4

我正在嘗試使用node-http-proxy將流量引導到端口3000(我的rails服務器)和端口8888(我的nodejs socket.io服務器)。我使用節點HTTP代理充當反向代理坐在端口80讓Node-http-proxy與socket.io一起工作?

var proxy = new httpProxy.HttpProxy({ 
    target: { 
    host: 'localhost', 
    port: CONFIG.RAILS_PORT, 
    } 
}); 

var server = http.createServer(function(req, res) { 
    // 
    // Proxy normal HTTP requests 
    // 
    proxy.proxyRequest(req, res); 
}); 

server.on('upgrade', function(req, socket, head) { 
    // 
    // Proxy websocket request to another port 
    // 
    console.log('inside upgrade'); 
    proxy.proxyWebSocketRequest(req, socket, head, { 
    host: 'localhost', 
    port: CONFIG.NODEJS_PORT 
    }); 
}); 

server.listen(80); 

var WrappedServer = require('./wrappedServer').WrappedServer 
var singleton = new WrappedServer(); 
singleton.run(CONFIG.NODEJS_PORT, {'log level': 2}); 

(我幾乎只是自述從節點-HTTP代理複製),這是我的客戶.js在瀏覽器上。

var socket = io.connect('http://localhost', {'sync disconnect on unload': false}); 

不知何故,io.connect無法連接到nodejs服務器。我從io.connect獲得此響應:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <title>Action Controller: Exception caught</title> 
    <style> 
    body { background-color: #fff; color: #333; } 

    body, p, ol, ul, td { 
     font-family: helvetica, verdana, arial, sans-serif; 
     font-size: 13px; 
     line-height: 18px; 
    } 

    pre { 
     background-color: #eee; 
     padding: 10px; 
     font-size: 11px; 
    } 

    a { color: #000; } 
    a:visited { color: #666; } 
    a:hover { color: #fff; background-color:#000; } 
    </style> 
</head> 
<body> 

<h1>Routing Error</h1> 
<p><pre>No route matches [GET] &quot;/socket.io/1&quot;</pre></p> 
</body> 
</html> 

任何想法如何讓io.connect連接到nodejs服務器?我不知道如何觸發io.connect到達server.upgrade集團。

謝謝 !

+0

我有幾乎相同的問題。你有沒有找到這個解決方法? – Luc 2012-05-29 13:38:32

回答

1

使用socket.io,您首先執行一次http握手。這一步不涉及websocket連接。你從http-proxy github頁面的readme部分引用的上面的代碼告訴如何直接監聽websocket請求。在這裏,你需要一個普通的路由條目(使用HTTP資源)來處理socket.io,當握手完成時,你的連接將升級到websocket,代理將自動處理它。

這裏是一個僞代碼。我在生產中使用它來代理多個由實際物理資源(HTTP資源)標識的socket-io服務器。

假設我有以下的IP和端口運行如下 - 2個socket.io服務器

  1. IP1:3000
  2. IP2:3001

現在我們代理的代碼(與IP IP3)看起來喜歡 -

var options = { 
    "ip3/Socket1/socket.io" : "ip1:3000/socket.io", 
    "ip3/Socket2/socket.io" : "ip2:3001/socket.io" 
} 

proxy = require('http-proxy').createServer(options).listen(80); 

幾點這裏 - 注意

  • 這裏我使用Socket1Socket2作爲分別標識第一個和第二個socket-io服務器的別名。
  • 只要您有權訪問它,您就可以代理任何機器。即您可以從代理服務器(此處爲ip3)ping那些機器(ip1和ip2在這裏),並且沒有防火牆阻止您的連接(您是同一網絡的一部分)。
  • 如果你有上述所有的同一臺主機上,你可以用localhost

客戶端替換ip1ip2 JavaScript代碼會是這個樣子我目前的示例 -

var socket1 = io.connect('http://ip3:80', {'resource': 'Socket1/socket.io'}); 
var socket2 = io.connect('http://ip3:80', {'resource': 'Socket2/socket.io'}); 

所有這一切看起來像很多消化立即。讓我知道你是否仍然面臨這個問題。