在服务器端使用Sinatra和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;
  }
}

upstream节中试过keepalive proxy_set_header Connection keep-alive;4次,在location节中试过proxy_set_header Connection keep-alive;次.

没有什么帮助:(

没有持久性连接,也没有未传递给任何客户端的消息.

推荐答案

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

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

proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;

把它们放在location区,它应该会起作用.

您可能还需要添加

proxy_buffering off;
proxy_cache off;

这不是官方的做法.

我以"try 与错误"+"谷歌搜索"结束了这篇文章:

Ruby相关问答推荐

这是按引用传递/值传递的误解,导致此方法无法按预期输出吗?

如何从外部获取给定 lambda 的参数值,而不显式返回其绑定?

是否应该在生产时缩小服务器代码?

Ruby 中的 class() 与 type()

Rails 类 << self

如何获取字符串中所有出现的 Ruby 正则表达式的匹配数据?

使用 bundler 安装较新版本的 bundler

Ruby代码美化,多行拆分长指令

如何绘制 git repo 的代码行历史记录?

如何按字母顺序排列忽略大小写的数组?

如何在 Ruby 符号中转义破折号-?

获取下周一(或一周中的任何一天)的日期的 Ruby 代码

判断字符串是否为空的Ruby方法?

Ruby 中的超级关键字

如何使用密码保护我的 /sidekiq 路由(即需要对 Sidekiq::Web 工具进行身份验证)?

项目目录的相对路径

判断散列的键是否包含所有键集

如何理解 class_eval() 和 instance_eval() 的区别?

检索/列出 Redis 数据库中的所有键/值对

如何在 Capistrano v3 的服务器上运行 shell 命令?