2

複数の socket.io Websocket をリバース プロキシし、URL を書き換えて、複数のバックエンド tty.js インスタンスに接続できるフロント エンド サーバーを作成しようとしています。

例えば:

http://mysite.com/server1 reverse proxies to http://server1/ which is running tty.js

http://mysite.com/server2 reverse proxies to http://server2/ which is running tty.js

HTTP の場合、古いプロキシは問題なく動作します。ただし、websocket の代わりに URL を書き換えると、次のようになります。

http://mysite.com/server1/socket.io/1/?t=1354135029745 -> http://server1/socket.io/1/?t=1354135029745

次のようになります。

http://mysite.com/socket.io/1/?t=1354135029745

もちろん、これは処理されません。書き換えが発生すると仮定すると、ソケットは「接続」が /server1/socket.io/1/?t=1354135029745 ではなく /socket.io/1/?t=1354135029745 にあると想定します

URL の書き換えと websocket のプロキシを行う方法はありますか?

これまでのところ、TCP プロキシ モジュールを使用して Varnish、node-http-proxy、および Nginx の両方を試しましたが、これを機能させる方法を理解できませんでした。

現在、Varnish の設定は次のようになっています。

backend backend1 {
    .host = "1.1.1.1";
    .port = "8080";
    .connect_timeout = 1s;
    .between_bytes_timeout = 60s;
    .max_connections = 800;
}

backend backend2 {
    .host = "2.2.2.2";
    .port = "8080";
    .connect_timeout = 1s;
    .between_bytes_timeout = 60s;
    .max_connections = 800;
}

sub vcl_recv {
    set req.grace = 120s
    if(req.url ~ "^/server1/") {
       set req.url = regsub(req.url, "^/server1/", "/");
       set req.backend = backend1;
       return(pipe);
    }
    if(req.url ~ "^/server2/") {
       set req.url = regsub(req.url, "^/server2/", "/");
       set req.backend = backend2;
       return(pipe);
    }
}

sub vcl_pipe {
    if(req.http.upgrade) {
        set bereq.http.upgrade = req.http.upgrade;
    } else {
        set bereq.http.connection = "close";
    }
    return(pipe);
}

私は義務を省くことを余儀なくされています:

 if(req.url ~ "^/socket.io/") {
    set req.backend = backend1;
    return(pipe);
 }

複数のバックエンドがあるためです。node-http-proxy、Nginx、または Varnish を使用してこれを機能させる方法はありますか? または、それらのどれも能力を持っていない場合、haproxy のような何かまたは実際に他の何かができるのでしょうか?

私の最初の傾向は、カスタム ヘッダーを設定して、URL が書き換えられたときにヒットするバックエンドを認識できるようにすることですが、それが機能するかどうか、またはどのように機能するかはわかりません。

編集 1: req.http.referer をプルして socket.io ステートメントに追加することで、この問題をある程度修正することができました。

if(req.url ~ "^/socket.io/" && req.http.referer ~ "server1"){
   set req.backend = backend1;
   return(pipe);
}

ただし、少し不安定なようで、socket.io を xhr ポーリングに戻すようです。これは理想的ではありませんが、何もしないよりはましです。

編集 2: いくつかのバックエンドでテストした後、長いポーリングが開始されると、残りのプロキシが壊れます。ページを更新するとすぐに、次の代わりにリバース プロキシが表示されます。

http://mysite.com/server1 -> http://server1

行きます:

http://mysite.com/ -> http://server1

ワニスをリロードしてから戻るまで。

4

1 に答える 1

0

Host:ほとんどの場合、次のヘッダーも変更する必要がありますvcl_recv()

sub vcl_recv {
    set req.grace = 120s
    if(req.url ~ "^/server1/") {
       set req.url = regsub(req.url, "^/server1/", "/");
       set req.http.host = "server1";
       set req.backend = backend1;
       return(pipe);
    }
    if(req.url ~ "^/server2/") {
       set req.url = regsub(req.url, "^/server2/", "/");
       set req.http.host = "server2";
       set req.backend = backend2;
       return(pipe);
    }
}

それはあなたの最初の問題を処理するはずです。

ただし、Varnish でパイプを使用すると、考慮すべき落とし穴があります。最も重要なのはX-Forwarded-For、最初のリクエストの後のヘッダーの欠如です。

于 2012-12-03T07:17:54.263 に答える