2013-02-25 13 views
6

Napisałem serwer proxy http w węźle node.js działającym na porcie 80. Potrzebuję jedynie przekierowania ruchu socket.io do portu 9090 i standardowego ruchu http do Apache w 8080. To jest mój kod proxy:node.js: proxy websockets do innego portu

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); 

Wszystko działa, ale io.socket wraca do Xhr-pollingu.

http://localhost/client.htm - falls back to xhr-polling 

file:///C:/.../client9090.htm - still uses websocket 

socket.io aplikacja jest uruchomiona na porcie 9090, client.htm łączy się 80 i client9090.htm łączy się bezpośrednio 9090.

To wygląda jak węzeł-http-proxy sprawia socket.io aplikację pracować w trybie xhr-polling. Klienta Chrome V.25

kod socket.io aplikacja

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); 
     }); 
    }); 

kod 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 jest taka sama, ale został zastąpiony przez localhost localhost: 9090

Jak już powiedziałem, everythig działa dobrze, tylko problem polega na tym, że node-http-proxy sprawia, że ​​wraca z websockets do Xhr-polling. Czy ktoś może pomóc?

Odpowiedz

2

Według https://npmjs.org/package/http-proxy, podczas dodawania oddzwanianie do httpProxy.createServer(), trzeba ręcznie proxy „upgrade” wydarzenia, więc coś takiego:

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); 
}); 

Jednak za korzystanie ty opisanej powyżej , nie potrzebujesz nawet funkcji oddzwaniania - możesz równie łatwo zrobić coś takiego:

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); 
Powiązane problemy