3

クライアントとブラウザ間の永続的な接続を維持するために、Node.jsをNginx http pushモジュールに接続する方法を知っている人はいますか?

私はコメットが初めてなので、出版などを理解していないだけで、誰かがこれを手伝ってくれるかもしれません。

これまでに設定したものは次のとおりです。jQuery.comet プラグインをダウンロードし、次の基本的なコードをセットアップしました。

クライアント JavaScript

<script type="text/javascript">

    function updateFeed(data) {
        $('#time').text(data);
    }

    function catchAll(data, type) {
        console.log(data);
        console.log(type);
    }

    $.comet.connect('/broadcast/sub?channel=getIt');
    $.comet.bind(updateFeed, 'feed');
    $.comet.bind(catchAll);

    $('#kill-button').click(function() {
        $.comet.unbind(updateFeed, 'feed');
    });
</script>

このことから私が理解できることは、クライアントは URL に続いて /broadcast/sub=getIt をリッスンし続けるということです。メッセージがあると、updateFeed が起動されます。

かなり基本的でわかりやすいIMO。

Nginx http プッシュ モジュール構成

default_type アプリケーション/オクテット ストリーム; sendfile オン; キープアライブ_タイムアウト 65; push_authorized_channels_only オフ;

server {
  listen       80;
  location /broadcast {
    location = /broadcast/sub {
      set $push_channel_id $arg_channel;
      push_subscriber;
      push_subscriber_concurrency broadcast;
      push_channel_group broadcast;
    }

    location = /broadcast/pub {
      set $push_channel_id $arg_channel;
      push_publisher;
      push_min_message_buffer_length 5;
      push_max_message_buffer_length 20;
      push_message_timeout 5s;
      push_channel_group broadcast;
    }
  }
}

これで、/broadcast/sub への呼び出しをポート 80 でリッスンするよう nginx に指示し、/broadcast/pub に送信された応答を返します。

かなり基本的です。この部分は理解するのがそれほど難しくなく、インターネット上で十分に文書化されています。ほとんどの場合、ブロードキャストを行うこの背後に ruby​​ または php ファイルがあります。

私の考えは、 node.js をブロードキャストすること/broadcast/pubです。persistent streaming dataこれにより、接続を切断することなくサーバーからクライアントにアクセスできるようになると思います。リクエストをループしてロングポーリングアプローチを試しましたが、これはより効率的だと思います。

それとも、これは機能しませんか。

Node.js ファイル

Node.js を作成するのに迷っています。まず最初に、node.js をこのように動作させる方法がわかりません。

ロングポーリングに使用したセットアップは次のとおりです。

var sys = require('sys'), 
http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(new Date());
    res.close();
    seTimeout('',1000);
}).listen(8000);

これはポート 8000 をリッスンし、応答変数に書き込むだけです。

長いポーリングの場合、nginx.config次のようになりました。

server {
  listen      80;
  server_name _;

  location / {
    proxy_pass   http://mydomain.com:8080$request_uri;
    include      /etc/nginx/proxy.conf;
  }
 }

これにより、ポート 80 が 8000 にリダイレクトされ、問題なく動作しました。

コメットが理解できるように Node.js を動作させる方法について、誰か考えを持っている人はいますか? 本当にいいだろうし、あなたは私を大いに助けてくれるでしょう.

資源

使用済み

faye を使用するにはコメット クライアントをインストールする必要がありますが、Nginx で提供されているものを使用したいと考えています。それが私がフェイだけを使わない理由です。nginx が使用するものは、はるかに最適化されています。

追加

4

1 に答える 1

2

あなたのリンクを見ると、すべての pub/sub 作業は Nginx によって行われているように思えます。Ruby コードはそれをテストしてメッセージを送信するためだけに使用されます。クライアントはまだロング ポーリングを使用しています。

上記のスクリプトでは、パブリッシャーが 5 秒ごとに新しいイベントを Nginx サーバーに送信します。Nginx サーバーは、ロング ポーリング接続を開いてデータを待機している 2 つのサブスクライバーにデータをプッシュします。メッセージが各サブスクライバーに送信されると、Nginx は接続を閉じ、クライアントはすぐに接続を再確立して、次に利用可能なメッセージを待ちます。

Nginx は、メッセージの単純な再翻訳者として機能します (非常に巧妙な設定です。リンクに感謝します)。

簡単に言えば、ブラウザは、あなたが行おうとしているこの種の接続には対応していません。これが、WebSocketsが発明された目的です。

後で、Node.js でコードを作成して、Nginx でこのセットアップを使用します (私も興味があります)。

于 2010-04-05T10:32:15.770 に答える