Ruby EventSource/服务器通过Nginx发送事件

Ruby EventSource/服务器通过Nginx发送事件,ruby,nginx,sinatra,Ruby,Nginx,Sinatra,在服务器端使用带有流的Sinatra块 get '/stream', :provides => 'text/event-stream' do stream :keep_open do |out| connections << out out.callback { connections.delete(out) } end end 当我直接使用应用程序时,通过http://localhost:9292/,一切都很完美。连接是持久的,所有消息都传递给所有客

在服务器端使用带有
流的Sinatra

get '/stream', :provides => 'text/event-stream' do
  stream :keep_open do |out|
    connections << out
    out.callback { connections.delete(out) }
  end
end
当我直接使用应用程序时,通过
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;
  }
}
上游
部分尝试
保持1024个
,以及
代理集_头连接保持活动状态位于
位置

没有任何帮助:(


没有持久性连接和未传递给任何客户端的消息。

您的Nginx配置是正确的,您只遗漏了几行

下面是一个通过Nginx制作
EventSource
的“魔术三人组”:

proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
将它们放入
位置
部分,它应该可以工作

您可能还需要添加

proxy_buffering off;
proxy_cache off;
这不是官方的做法


我以“尝试和错误”+“谷歌搜索”结束了这篇文章:)

不要自己写这篇文章。Nginx是一个出色的事件服务器,它的模块可以为您处理SSE,而不会降低上游服务器的性能

退房

它的工作方式是订户(使用SSE的浏览器)连接到Nginx,并且连接在那里停止。发布者(您在Nginx后面的服务器)将通过相应的路由向Nginx发送POST,此时Nginx将立即转发到浏览器中等待的EventSource侦听器


此方法比让ruby Web服务器处理这些“长轮询”SSE连接更具可扩展性。

另一个选项是在响应中包含一个值为“否”的“X-Accel-Buffering”头。Nginx特别对待它,
请参见

,效果非常好。伙计,这很难调试。非常感谢!让服务器用“X-Accel-Buffering:no”标题响应非常有帮助!(请参阅:)这对我来说不起作用,直到我还添加了以下内容:-代理缓冲关闭;代理缓存关闭;你的尝试和错误+我的第一次谷歌点击=我喜欢堆栈溢出。谢谢你只是按照官方的方式做了,干得好!谢谢,这在不更改nginx配置的情况下帮助我解决了这个问题
proxy_buffering off;
proxy_cache off;