nodejs - node.js: proxy websockets a otro puerto
socket io tutorial (1)
He escrito http proxy en node.js ejecutándose en el puerto 80. Todo lo que necesito es redirigir el tráfico de socket.io al puerto 9090 y el tráfico http estándar a Apache en 8080. Este es mi código proxy:
httpProxy = require(''http-proxy'');
httpProxy.createServer(function (req, res, proxy) {
if (req.url.match(/socket.io/)) {
proxy.proxyRequest(req, res, {
host: ''localhost'',
port: 9090
});
} else {
proxy.proxyRequest(req, res, {
host: ''localhost'',
port: 8080
});
}
}).listen(80);
Todo funciona, pero io.socket regresa a xhr-polling.
http://localhost/client.htm - falls back to xhr-polling
file:///C:/.../client9090.htm - still uses websocket
La aplicación socket.io se ejecuta en el puerto 9090, client.htm se conecta a 80 y client9090.htm se conecta directamente a 9090.
Parece que un nodo-http-proxy hace que la aplicación socket.io funcione en el modo xhr-polling. El cliente es Chrome v.25
Código de la aplicación socket.io
var io = require(''socket.io'').listen(9090);
io.on(''connection'', function (socket) {
socket.on(''hi!'', function (data) {
console.log(data);
socket.emit(''news'');
});
socket.on(''ahoj'', function (data) {
console.log(data);
});
});
código client.htm
<script src="http://localhost/socket.io/socket.io.js"></script>
<script>
var chat = io.connect(''http://localhost'')
chat.on(''connect'', function () {
chat.emit(''hi!'');
});
chat.on(''news'', function () {
chat.emit(''ahoj'',{a:1,b:2});
});
</script>
client9090.htm es el mismo pero localhost es reemplazado por localhost: 9090
Como dije, todo funciona bien, el único problema es que el nodo-http-proxy hace que los websockets retrocedan a xhr-polling. ¿Alguien puede ayudar?
De acuerdo con https://npmjs.org/package/http-proxy , cuando se agrega una devolución de llamada a httpProxy.createServer (), tiene que proxy manualmente ''actualizar'' eventos, por lo que algo como esto:
httpProxy = require(''http-proxy'');
// added `var server =` here
var server = httpProxy.createServer(function (req, res, proxy) {
if (req.url.match(/socket.io/)) {
proxy.proxyRequest(req, res, {
host: ''localhost'',
port: 9090
});
} else {
proxy.proxyRequest(req, res, {
host: ''localhost'',
port: 8080
});
}
}).listen(80);
// added upgrade listener section here:
server.on(''upgrade'', function (req, socket, head) {
server.proxy.proxyWebSocketRequest(req, socket, head);
});
Sin embargo, para el uso que describió anteriormente, ni siquiera necesita la función de devolución de llamada; puede hacer algo como esto con la misma facilidad:
httpProxy = require(''http-proxy'');
var options = {
pathnameOnly: true,
router: {
''/wiki'': ''127.0.0.1:8001'',
''/blog'': ''127.0.0.1:8002'',
''/api'': ''127.0.0.1:8003''
}
}
var proxyServer = httpProxy.createServer(options);
proxyServer.listen(80);