通过Nginx的的EventSource /服务器发送的事件(EventSource / Serve

2019-06-21 11:13发布

使用屈与服务器侧stream块。

get '/stream', :provides => 'text/event-stream' do
  stream :keep_open do |out|
    connections << out
    out.callback { connections.delete(out) }
  end
end

在客户端:

var es = new EventSource('/stream');
es.onmessage = function(e) { $('#chat').append(e.data + "\n") };

当我使用的应用程序直接通过http://localhost:9292/ ,一切都运行完美。 连接是持久的,所有消息都传递给所有的客户。

然而,当它经过的Nginx, http://chat.dev ,连接被丢弃,重新连接火灾每秒左右。

Nginx的设置看起来确定对我说:

upstream chat_dev_upstream {
  server 127.0.0.1:9292;
}

server {
  listen       80;
  server_name  chat.dev;

  location / {
    proxy_pass http://chat_dev_upstream;
    proxy_buffering off;
    proxy_cache off;
    proxy_set_header Host $host;
  }
}

试图keepalive 1024upstream部以及proxy_set_header Connection keep-alive;location

没有什么帮助:(

没有持续的连接和邮件不会传递到任何客户端。

Answer 1:

你Nginx的配置是正确的,你只是错过几行。

这里是一个“魔术三人组”制作EventSource通过Nginx的工作:

proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;

他们放入location部分,它应该工作。

您还可能需要添加

proxy_buffering off;
proxy_cache off;

这不是做这件事的一个正式的方式。

我结束了这种通过“试错” +“谷歌搜索” :)



Answer 2:

不要从头开始自己写这个。 Nginx的是一个奇妙的事件触发服务器,并具有将处理SSE你没有你的上游服务器的任何性能下降的模块。

退房https://github.com/wandenberg/nginx-push-stream-module

它的工作方式是(使用SSE浏览器)连接到Nginx的用户,以及连接停在那里。 出版者(Nginx的背后你的服务器)将在相应的路由,并在那一刻Nginx的一个POST发送到Nginx的会立即将在浏览器中等待的EventSource听众。

这种方法比让您的红宝石Web服务器处理这些“长轮询” SSE连接更具扩展性。



Answer 3:

另一种选择是在你的回应包括与价值“不”一个“X-加速-缓冲”头。 Nginx的对待它特别,看到http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering



文章来源: EventSource / Server-Sent Events through Nginx