【问题标题】:SSE over https not working通过 https 的 SSE 不起作用
【发布时间】:2017-09-22 19:27:38
【问题描述】:

我在使用 SSE over https 时遇到问题,让我说清楚,我有一个监听 https 的 Nginx 服务器,后面有一个 Rails Puma,所以我在 js(coffescript) 中有这个:

initStream = () ->
   rechargePayment.source = new 
    EventSource('/proggress/stream')

在 Rails 控制器中我有:

  def stream
    response.headers['Content-Type'] = 'text/event-stream'
    redis = Redis.new
    redis.psubscribe(['proggress.refresh', 'heartbeat']) do |on|
      on.pmessage do |_pattern, event, data|
        response.stream.write("event: #{event}\n")
        response.stream.write("data: #{data}\n\n")
      end
    end
  rescue IOError
    logger.info 'Stream stoped'
  ensure
    logger.info 'Stopping Stream Thread'
    redis.quit
    response.stream.close
  end

当我通过 https 尝试此操作时,它什么也不做,在日志中我只看到错误:“流已关闭”,但如果我通过 http 尝试它,它会完美运行。

编辑:我看到了这个: "EventSource 接口用于接收服务器发送的事件。它通过 HTTP 连接到服务器,并以文本/事件流格式接收事件,而无需关闭连接。"

来源:https://developer.mozilla.org/en-US/docs/Web/API/EventSource

那么,这是否意味着它只适用于http?

【问题讨论】:

    标签: javascript ruby-on-rails nginx redis server-sent-events


    【解决方案1】:

    是的,问题出在 nginx 中,我必须进行以下设置:

    proxy_set_header Connection '';
    proxy_http_version 1.1;
    chunked_transfer_encoding off;
    

    并在 Rails 控制器中添加:

    response.headers['X-Accel-Buffering'] = 'no'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 2018-10-26
      • 2013-01-16
      相关资源
      最近更新 更多