6

ポート 80 で実行される node.js に http プロキシを記述しました。必要なのは、socket.io トラフィックをポート 9090 にリダイレクトし、標準の http トラフィックを 8080 の Apache にリダイレクトすることだけです。これが私のプロキシ コードです。

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 に直接接続します。

node-http-proxy により、socket.io アプリが xhr-polling モードで動作するようになります。クライアントは Chrome v.25 です

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 は同じですが、localhost は localhost:9090 に置き換えられます

私が言ったように、すべてうまく機能しますが、唯一の問題は、node-http-proxy が websockets から xhr-polling にフォールバックすることです。誰でも助けることができますか?

4

1 に答える 1

2

https://npmjs.org/package/http-proxyによると、コールバックを httpProxy.createServer() に追加する場合、「アップグレード」イベントを手動でプロキシする必要があるため、次のようになります。

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

ただし、上記の使用法では、コールバック関数さえ必要ありません。次のようなことを簡単に行うことができます。

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);
于 2013-03-27T21:56:09.307 に答える