15

socket.io 経由で websocket を使用するアプリケーションがあります。私のアプリケーションでは、アプリケーションの静的コンテンツと JavaScript を提供するために別の HTTP サーバーを使用したいと考えています。したがって、プロキシを配置する必要があります。

node-http-proxyを使用しています。出発点として、websockets アプリをポート 8081 で実行しています。次のコードを使用して、socket.io 通信をこのスタンドアロン サーバーにリダイレクトし、express を使用して静的コンテンツを提供しています。

var http = require('http'),
    httpProxy = require('http-proxy'),
    express = require('express');

// create a server
var app = express();
var proxy = httpProxy.createProxyServer({ ws: true });

// proxy HTTP GET / POST
app.get('/socket.io/*', function(req, res) {
  console.log("proxying GET request", req.url);
  proxy.web(req, res, { target: 'http://localhost:8081'});
});
app.post('/socket.io/*', function(req, res) {
  console.log("proxying POST request", req.url);
  proxy.web(req, res, { target: 'http://localhost:8081'});
});

// Proxy websockets
app.on('upgrade', function (req, socket, head) {
  console.log("proxying upgrade request", req.url);
  proxy.ws(req, socket, head);
});

// serve static content
app.use('/', express.static(__dirname + "/public"));

app.listen(8080);

上記のアプリケーションは問題なく動作しますが、socket.io が Websocket を使用しなくなり、代わりに XHR ポーリングにフォールバックしていることがわかります。

プロキシ コードのログを見ると、次のように確認できます。

proxying GET request /socket.io/1/?t=1391781619101
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294
proxying POST request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=1391781629
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294

Webソケット通信をプロキシする方法を知っている人はいますか? のすべての例は、node-http-proxy一部をプロキシして他のトラフィックを処理するのではなく、すべてのトラフィックをプロキシすることを前提としています。

4

2 に答える 2

1

両方のサーバーが必要ですか? そうでない場合は、静的ファイルとソケット接続をリッスンするために同じサーバーを使用できます。

// make the http server
var express = require('express'),
    app = express(), server = require('http').createServer(app),
    io;

// serve static content
server.use('/', express.static(__dirname + '/public'));

server.listen(8080);

// listen for socket connections
io = require('socket.io').listen(server);

// socket stuff here
于 2014-02-07T16:19:23.877 に答える