服务器发送事件连接未与Apache / Thin / Sinatra保持打开状态

时间:2013-02-02 17:15:06

标签: apache sinatra thin server-sent-events

我正在尝试使用Apache / Thin / Sinatra设置基本的服务器端事件能力。当我直接运行Thin服务器时,一切都正常工作。当我使用RackBaseURI配置设置通过Apache运行Thin服务器时,一切仍然有效,但连接不会持久存在。它经历了一个打开循环,将一些数据写入浏览器并立即关闭。看起来像Apache配置问题?

我已经浏览了Apache配置,看不到任何看起来会妨碍打开连接的内容。因为我不确定错误在哪里,所以我不想发布无穷无尽的配置数据,所以如果我遗漏了某些东西,我可以加入更多......

sinatra(1.3.4), 薄(1.5.0), Apache / 2.2.22(Ubuntu), 红宝石1.8.7

JavaScript ......

$j(function(){

  console.log("Starting...");

  var es = new EventSource("/stream_event");

  es.addEventListener('message', function(e) {
    console.log(e.data);
  }, false);

  es.addEventListener('open', function(e) {
    console.log("Connection Open");
  }, false);

  es.addEventListener('error', function(e) {
    console.log("error = " + e.eventPhase)
    if (e.eventPhase == EventSource.CLOSED) {
      console.log("Connection Closed");
    }
  }, false);
}

服务器端sinatra / ruby​​ ..

set :server, :thin
connections = []

get '/' do
  content_type 'text/event-stream'
  stream(:keep_open) { |out| 
    connections << out
    out << "data: hello\n\n" 
  }
end

get '/post_message' do
  connections.each { |out| out << params[:message] << "\n" }
  "message sent"
end

编辑:

这是我在浏览器控制台中看到的输出......

Connection Open
hello
error = 2
Connection Closed
Connection Open
hello
error = 2
Connection Closed 
Connection Open
hello
error = 2
Connection Closed 
Connection Open
hello
error = 2
Connection Closed 
Connection Open
hello
error = 2
Connection Closed  

1 个答案:

答案 0 :(得分:0)

似乎与RackBaseURI配置设置有关。我能够通过删除该属性并使用Apache的代理功能将流量引导到我的Sinatra应用程序来实现工作......

ProxyPass /stream_event http://127.0.0.1:9292
ProxyPassReverse /stream_event http://127.0.0.1:9292

这里的主要缺点是我需要使用其他一些进程手动启动和监视正在运行的Sinatra应用程序。