Pergunta

Alguém conhece uma maneira ou talvez pense que é possível conectar o Node.js ao módulo push http Nginx para manter uma conexão persistente entre o cliente e o navegador.

Eu sou novo no cometa, então não entendo a publicação, etc., talvez alguém possa me ajudar com isso.

O que eu configurei até agora é o seguinte.Baixei o plugin jQuery.comet e configurei o seguinte código básico:

JavaScript do cliente

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

O que posso entender disso é que o cliente continuará ouvindo a url seguida de /broadcast/sub=getIt.Quando houver uma mensagem, ele disparará updateFeed.

IMO bastante básico e compreensível.

Configuração do módulo push http Nginx

aplicação default_type/octeto-stream;enviar arquivo ativado;keepalive_timeout 65;push_authorized_channels_only desativado;

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, agora isso diz ao nginx para escutar na porta 80 qualquer chamada para/broadcast/sub e retornará todas as respostas enviadas para/broadcast/pub.

Bem básico também.Esta parte não é tão difícil de entender e está bem documentada na internet.Na maioria das vezes há um arquivo Ruby ou php por trás disso que faz a transmissão.

Minha ideia é transmitir node.js /broadcast/pub.Eu acho que isso vai me deixar ter persistent streaming data do servidor para o cliente sem interromper a conexão.Tentei a abordagem de pesquisa longa com loop da solicitação, mas acho que será mais eficiente.

Ou isso não vai funcionar.

Arquivo Node.js

Agora, para criar o Node.js, estou perdido.Em primeiro lugar, não sei como fazer com que o node.js funcione dessa maneira.

A configuração que usei para pesquisas longas é a seguinte:

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

Isso escuta a porta 8000 e apenas grava na variável de resposta.

Por muito tempo pesquisando meu nginx.config parecia algo assim:

server {
  listen      80;
  server_name _;

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

Isso apenas redirecionou a porta 80 para 8000 e funcionou bem.

Alguém tem uma ideia de como fazer o Node.js agir de uma maneira que o Comet o entenda.Seria muito legal e você vai me ajudar muito.

Recursos

usado

Para usar o faye tenho que instalar o cliente comet, mas quero usar o fornecido com o Nginx.É por isso que não uso apenas faye.Aquele que o nginx usa é muito mais otimizado.

extra

Foi útil?

Solução

Olhando para seu link parece-me que todo o trabalho de pub/sub é feito pelo Nginx, o código Ruby é usado apenas para testá-lo e enviar mensagens.Os clientes ainda usam pesquisas longas:

No script acima, a cada cinco segundos um editor emite um novo evento para nosso servidor Nginx, que por sua vez envia os dados para dois assinantes que têm conexões de pesquisa longa abertas e estão aguardando dados.Assim que a mensagem é enviada para cada assinante, o Nginx fecha suas conexões e os clientes imediatamente restabelecê-los para aguardar a próxima mensagem disponível.

O Nginx serve como um retradutor simples para mensagens (configuração muito inteligente, aliás, obrigado pelo link).

Para resumir:os navegadores não são capazes desse tipo de conexão que você está tentando fazer.Isso é o que WebSockets foram inventados para.

Mais tarde farei alguns códigos em Node.js para usar esta configuração com Nginx (também estou interessado nisso).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top