我试图使用node-http-proxy将流量定向到端口3000(我的rails服务器)和端口8888(我的nodejs socket.io服务器)。我使用node-http-proxy作为端口80上的反向代理。
(我基本上只是从node-http-proxy复制自述文件)
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握手。此步骤不涉及websocket连接。上面的代码是您从http-proxy github页面的自述部分引用的,它告诉您如何直接侦听websocket请求。在这里,您需要一个用于socket.io的正常路由条目(使用HTTP资源)并且当握手完成时,您的连接将升级到websocket,代理将自动处理它。
这是一个伪代码。我在生产中使用它代理多个socket-io服务器,这些服务器由实际的物理资源(HTTP资源)标识。
假设我有两个socket.io服务器在下面的ip和端口上运行,如下所示-
现在代理中的代码(带有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服务器。IP1
和IP2
替换为localhost
客户端javascript代码如下所示-
var socket1 = io.connect('http://ip3:80', {'resource': 'Socket1/socket.io'});
var socket2 = io.connect('http://ip3:80', {'resource': 'Socket2/socket.io'});
所有这些看起来一下子要消化的东西太多了。如果你还面临问题,请告诉我。