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;