Frage

Kennt jemand eine Möglichkeit oder hält es vielleicht für möglich, Node.js mit dem Nginx-HTTP-Push-Modul zu verbinden, um eine dauerhafte Verbindung zwischen Client und Browser aufrechtzuerhalten?

Ich bin neu bei Comet, daher verstehe ich die Veröffentlichung usw. einfach nicht. Vielleicht kann mir jemand dabei helfen.

Was ich bisher eingerichtet habe, ist Folgendes.Ich habe das jQuery.comet-Plugin heruntergeladen und den folgenden Basiscode eingerichtet:

Client-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>

Was ich daraus verstehen kann, ist, dass der Client weiterhin auf die URL gefolgt von /broadcast/sub=getIt hört.Wenn eine Nachricht vorliegt, wird updateFeed ausgelöst.

Ziemlich einfach und verständlich, meiner Meinung nach.

Konfiguration des Nginx-HTTP-Push-Moduls

default_type application/octet-stream;sendfile on;keepalive_timeout 65;push_authorized_channels_only aus;

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

Ok, das weist Nginx jetzt an, an Port 80 auf alle Aufrufe an /broadcast/sub zu warten und alle an /broadcast/pub gesendeten Antworten zurückzugeben.

Auch ziemlich einfach.Dieser Teil ist nicht so schwer zu verstehen und im Internet gut dokumentiert.Meistens steckt dahinter eine Ruby- oder PHP-Datei, die die Übertragung übernimmt.

Meine Idee ist, dass node.js ausgestrahlt wird /broadcast/pub.Ich denke, das wird es mir ermöglichen persistent streaming data vom Server zum Client, ohne die Verbindung zu unterbrechen.Ich habe den Long-Polling-Ansatz mit Schleifen der Anfrage ausprobiert, denke aber, dass dies effizienter sein wird.

Oder wird das nicht funktionieren?

Node.js-Datei

Jetzt bin ich beim Erstellen der Node.js verloren.Zunächst einmal weiß ich nicht, wie ich node.js auf diese Weise zum Laufen bringen kann.

Das Setup, das ich für lange Umfragen verwendet habe, ist wie folgt:

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

Dies lauscht auf Port 8000 und schreibt nur auf die Antwortvariable.

Für lange Umfrage meine nginx.config sah ungefähr so ​​aus:

server {
  listen      80;
  server_name _;

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

Dadurch wurde lediglich der Port 80 auf 8000 umgeleitet, was einwandfrei funktionierte.

Hat jemand eine Idee, wie Node.js sich so verhalten kann, wie Comet es versteht?Wäre wirklich nett und du wirst mir sehr helfen.

Ressourcen

gebraucht

Um Faye nutzen zu können, muss ich den Comet-Client installieren, möchte aber den mit Nginx gelieferten verwenden.Deshalb verwende ich nicht einfach Faye.Das von Nginx verwendete ist viel optimierter.

extra

War es hilfreich?

Lösung

Anschauen Dein Link Es scheint mir, dass die gesamte Pub/Sub-Arbeit von Nginx erledigt wird, Ruby-Code wird nur zum Testen und Senden von Nachrichten verwendet.Clients verwenden immer noch lange Abfragen:

Im obigen Skript sendet ein Herausgeber alle fünf Sekunden ein neues Ereignis an unseren Nginx-Server, der die Daten wiederum an zwei Abonnenten weiterleitet die lange Polling-Verbindungen offen haben und warten auf Daten.Sobald die Nachricht an jeden Abonnenten gesendet wurde, schließt Nginx deren Verbindungen und die Clients anschließend sofort sie wieder herstellen um auf die nächste verfügbare Nachricht zu warten.

Nginx dient als einfacher Rückübersetzer für Nachrichten (übrigens sehr cleveres Setup, danke für den Link).

Um es kurz zu machen:Browser sind für diese Art von Verbindung, die Sie herstellen möchten, nicht geeignet.Das ist was WebSockets wurden dafür erfunden.

Später werde ich Code in Node.js erstellen, um dieses Setup mit Nginx zu verwenden (ich bin auch daran interessiert).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top