我正在尝试使用node-http-proxy将流量定向到端口3000(我的rails服务器)和端口8888(我的nodejs socket.io服务器).我使用node-http-proxy作为端口80上的反向代理. (我几乎只是从node-http-proxy复制README) v
(我几乎只是从node-http-proxy复制README)
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});
这是我在浏览器上的client.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] "/socket.io/1"</pre></p> </body> </html>
知道如何让io.connect连接到nodejs服务器吗?我不知道如何触发io.connect来访问server.upgrade bloc.
谢谢
!
这是一个伪代码.我在生产中使用它代理多个socket-io服务器,这些服务器由实际物理资源(HTTP资源)标识.
假设我在以下ip和端口上运行了两个socket.io服务器,如下所示 –
> ip1:3000
> 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);
这里要注意的一些要点 –
>这里我使用Socket1和Socket2作为别名来分别识别第一个和第二个socket-io服务器.
>只要您有权访问它,您就可以代理到任何机器.即你能够从你的代理服务器(这里是ip3)ping这些机器(这里是ip1和ip2)并且没有防火墙阻止你的连接(你是同一网络的一部分).
>如果您在同一主机上拥有上述所有内容,则可以使用localhost替换ip1和ip2
对于我当前的示例,客户端javascript代码看起来像这样 –
var socket1 = io.connect('http://ip3:80', {'resource': 'Socket1/socket.io'}); var socket2 = io.connect('http://ip3:80', {'resource': 'Socket2/socket.io'});
所有这一切看起来都很难消化.如果你仍然面临这个问题,请告诉我.