2013-02-25 16 views
6

私はポート80で動作するnode.jsにhttpプロキシを書いています。私が必要とするのは、socket.ioトラフィックをポート9090にリダイレクトし、標準HTTPトラフィックを8080上のApacheにリダイレクトすることです。私のプロキシコードはnode.js:他のポートへのプロキシWebソケット

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

すべて動作しますが、io.socketはxhr-pollingに戻ります。

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

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

socket.ioアプリはポート9090で実行されている、client.htmは80に接続し、client9090.htmは9090それはノード-HTTPプロキシのように見える

に直接接続socket.ioアプリを作りますxhr-pollingモードで動作します。 クライアントが

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

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が同じクロムV.25であるが、ローカルホストは、ローカルホストで置き換えられている:9090

私が言ったように、everythigはうまく動作しますが、問題はnode-http-proxyがwebsocketsからxhr-pollingにフォールバックすることだけです。 誰も助けることができますか?あなたは上記の使用のための

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

しかし、:https://npmjs.org/package/http-proxyによると

答えて

2

、)httpProxy.createServer(へのコールバックを追加するとき、あなたはに手動でプロキシ「アップグレード」のイベントを持っているので、このような何かコールバック関数も必要ありません。次のように簡単に行うことができます。

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); 
関連する問題