Ruby Sinatra::具有机架非分块响应的流式传输

Ruby Sinatra::具有机架非分块响应的流式传输,ruby,sinatra,rack,Ruby,Sinatra,Rack,我在尝试使用Sinatra和Rack进行这个简单的流式测试时遇到了困难 在我的stream.rb文件中,我有: require 'sinatra' require 'sinatra/streaming' class StreamAPI < Sinatra::Base helpers Sinatra::Streaming get '/stream' do stream do |out| 5.times do

我在尝试使用Sinatra和Rack进行这个简单的流式测试时遇到了困难

在我的stream.rb文件中,我有:

require 'sinatra'
require 'sinatra/streaming'
class StreamAPI < Sinatra::Base
    helpers Sinatra::Streaming
    get '/stream' do
        stream do |out|
            5.times do
                out.puts "Hello!"
                sleep 1
            end
            out.flush
        end
    end
    run! if app_file == $0
end
当我卷曲url时,我得到“Hello!”5次,但在5秒钟后全部一次。查看标题,我可以看到
传输编码
设置为
分块
。我想要的是一声“你好!”在停顿1秒后再次出现



编辑:除了下面选择的答案,我还需要添加
proxy\u buffering off到我的NGINX配置文件。

这取决于您使用的服务器。从:

请注意,流行为,特别是并发请求的数量,在很大程度上取决于用于服务应用程序的web服务器。有些服务器,比如WEBRick,甚至可能根本不支持流媒体。如果服务器不支持流,则在传递给流的块完成执行后,将立即发送正文


看起来您使用的服务器不支持流式传输。如果您切换到一个可以(例如或)的流媒体,这应该会起作用。

对流媒体不太熟悉,但您的代码要求它每隔一秒而不是每5秒放置一次“Hello!”
对不起,我尝试了很多不同的值,并在此处放置了错误的值。因此,如果我安装了thin,请使用
set:server,“thin”
它应该使用thin而不是webrick,这应该可以解决我的问题?@ecnepsnai是的,应该可以。事实上,您可能不需要添加
set:server,:thin
,因为它会被自动检测到,但是如果您依赖它,则包含它会更安全。@ecnepsnai如果您使用
rackup
set:server,:thin
将无法工作(它只影响Sinatra内置服务器),在这种情况下,您需要使用
rackup-s thin
(尽管
rackup
可能会自动检测到thin(如果安装了)。您还可以将
\s thin
添加到
config.ru
中,这将产生相同的效果。因此,我现在正在使用thin,但它仍然不能像我预期的那样工作。我仍然有同样的问题。除了现在,即使没有
sleep
命令,响应也只需要1分钟。
require 'rack'
require './stream.rb'
run StreamAPI