سؤال

هل يعرف أي شخص طريقة أو ربما يعتقد أنه من الممكن توصيل Node.js باستخدام وحدة دفع Nginx HTTP للحفاظ على اتصال مستمر بين العميل والمتصفح.

أنا جديد على المذنب ، لذا لا تفهم النشر وما إلى ذلك ، ربما يمكن لشخص ما مساعدتي في هذا.

ما أنشأته حتى الآن هو ما يلي. لقد قمت بتنزيل المكون الإضافي 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. عندما تكون هناك رسالة ، ستطلق النار على Firefeed.

IMO أساسية ومفهومة.

Nginx HTTP Push Module Config

Default_Type Application/Octet-stream ؛ sendfile على ؛ keepalive_timeout 65 ؛ push_authorized_channels_only Off ؛

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

حسنًا ، هذا يخبر Nginx بالاستماع في المنفذ 80 للحصول على أي مكالمات /بث /فرعي وسيعيد أي ردود تم إرسالها إلى /البث /الحانة.

أساسية جدا أيضا. هذا الجزء ليس من الصعب فهمه ، ويتم توثيقه جيدًا عبر الإنترنت. في معظم الأوقات ، يوجد ملف 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. لهذا السبب لا أستخدم فاي فقط. يستخدم One Nginx أكثر من ذلك بكثير.

إضافي

هل كانت مفيدة؟

المحلول

انظر الى وصلتك يبدو لي أن جميع الأعمال/الفرعية يتم تنفيذها بواسطة Nginx ، يتم استخدام رمز Ruby فقط لاختباره وإرسال الرسائل. لا يزال العملاء يستخدمون الاقتراع الطويل:

في البرنامج النصي أعلاه ، كل خمس ثوانٍ ينبعث الناشر حدثًا جديدًا لخادم Nginx ، والذي بدوره يدفع البيانات إلى مشتركين التي تفتح اتصالات طويلة الجناح وينتظرون البيانات. بمجرد إرسال الرسالة إلى كل مشترك ، يغلق Nginx اتصالاتهم والعملاء على الفور إعادة تأسيسهم لانتظار الرسالة التالية المتاحة.

يعمل Nginx كإعادة نقل بسيطة للرسائل (الإعداد الذكي جدًا راجع للشغل ، شكرًا على الرابط).

بعبارة قصيرة: المتصفحات غير قادرة على هذا النوع من الاتصال الذي تحاول القيام به. هذا هو ما WebSockets اخترع ل.

في وقت لاحق ، سأقوم بعمل بعض التعليمات البرمجية في Node.js لاستخدام هذا الإعداد مع Nginx (أنا مهتم به أيضًا).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top