我目前正在一个网站上,作为以下function:
我正在使用:Rails 4 + Puma + Nginx
我正在使用ActionController :: Live,并创build了一个事件动作,在页面加载时被调用,监听器绑定到它监听聊天消息或更改统计信息。
def events response.headers["Content-Type"] = "text/event-stream" sse = ServerEvent.new(response.stream) redis = Redis.new # the safe_write method is the implementation of a workaround for the problem stated on # http://evaleverything.com/2013/09/07/response-streams-with-rails-4-and-redis sse.safe_write do redis.psubscribe("redis-foobar-key*") do |on| on.pmessage do |pattern, event, data| sse.write(data, { event: event}) end end end rescue IOError puts "Stream Closed" ensure puts "closing all threads and connections\n" redis.quit sse.close end
我面临的问题是:加载页面时,有时一切正常,我可以启动eventsource和正确处理事件,但有时事件源请求保持挂起 ,不返回任何forms的错误。
我已经通过以下方式取得了成功:
并通过以下尝试失败:
我使用nginx,但不认为这是问题,但是,这里是我的configuration
upstream bar { server foo.com:9292; } server { listen 80; server_name foo.com megafoo.com; root /(...)/public; location / { proxy_pass http://bar; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Connection ''; proxy_http_version 1.1; chunked_transfer_encoding off; proxy_buffering off; proxy_cache off; if (-f $request_filename) { break; } } location ~* ^/assets/ { # Per RFC2616 - 1 year maximum expiry expires 1y; add_header Cache-Control public; # Some browsers still send conditional-GET requests if there's a # Last-Modified header or an ETag header even if they haven't # reached the expiry date sent in the Expires header. add_header Last-Modified ""; add_header ETag ""; break; } }
看起来像防病毒阻止连接,不允许它成功完成