2

HAProxy目の前で使用していますが、接続が適切に閉じられないように見えるというSockJS servers問題があります。SockJS

私のNodeJSコード:

var sockjsSockets = {};


/**
 * SockJS Server
 */
var echo = sockjs.createServer({
    log: function (severity, message) {
        // Skip logging
    },
    disconnect_delay: 20
});
echo.on('connection', function (conn) {

    // Identify this connection
    sockjsSockets[conn.id] = conn;

    conn.on('data', function (message) {

        // Write...

    });
    conn.on('close', function () {

        try {
            delete sockjsSockets[conn.id];

            conn.close(); 
        } catch (er) {
            console.log("EXCEPTION CLOSE SOCKJS ::::::::>>>>>>> " + er.stack);
        }
    });
});

sockjsSocketsカウントは、たとえば次のように表示できます: 400 しかし、HAProxyそれへの 3000ish の現在の接続を示していますNodeJS instance

ここでクローズプロセスに何か欠けていますか?

何が間違っている可能性がありますか?

編集

ここに私のHAProxy設定があります

global
      maxconn     400000
      ulimit-n    800019
      nbproc      1
      debug
      daemon
      log         127.0.0.1   local0 notice

  defaults
      mode        http
      option      httplog
      log         global
      stats       enable
      stats       refresh 60s
      stats uri   /stats
      maxconn     32768


  frontend  secured
      timeout     client 86400000

      mode http
      timeout client 120s

      option httpclose
      option forwardfor

      bind        0.0.0.0:443 ssl crt /etc/nginx/ssl/ssl-bundle.pem ciphers RC4-SHA:AES128-SHA:AES:!ADH:!aNULL:!DH:!EDH:!eNULL


      acl is_sockjs path_beg /echo /broadcast /close # this is sockjs
      use_backend sockjs if is_sockjs
4

1 に答える 1

0

SockJS で使用できるさまざまなプロトコルがあり、WebSockets から始まり、Long Poll、AJAX などに分類されます。それらのそれぞれは、接続を維持するための異なるロジックを持っています。

WebSocket の場合は永続的な TCP 接続であり、閉じている場合は閉じる必要があります。Webサーバーはプロキシとして動作するため、引き続きそれを保持できます。

このような問題に対処するには、Web サーバーのキープアライブ、タイムアウトなどの設定を試し、HAProxy が node.js の接続ロジックを閉じることを確実にするための解決策を見つける必要があります。

于 2014-07-03T12:45:06.177 に答える