SSE / EventSource closes after first chunk of data (Rails 4 + Puma + Nginx) SSE / EventSource closes after first chunk of data (Rails 4 + Puma + Nginx) nginx nginx

SSE / EventSource closes after first chunk of data (Rails 4 + Puma + Nginx)


I will share configuration that worked.

nginx

upstream app_server {    server unix:/var/tmp/sockets/puma.sock    fail_timeout=0;}server {    listen 80 default_server;    listen 443 ssl;    client_max_body_size 8m;    server_tokens off;    server_name localhost;    keepalive_timeout 5;    location / {        try_files @uri @app;    }    location @app {      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;      proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;      proxy_set_header Host $http_host;      proxy_redirect off;      proxy_http_version 1.1;      chunked_transfer_encoding off;      proxy_buffering off;      proxy_pass http://app_server;    }}

controller

class StreamController < ActionController::Base  include ActionController::Live  def hello    response.headers["Content-Type"] = "text/event-stream" #; charset=utf-8"    10.times {      response.stream.write("data: Hello World!!\n\n")      sleep 1    }  rescue IOError    puts "Stream IO Error"    logger.info "Stream IO Error"  ensure    puts "Stream closed"    logger.info "Stream closed"    response.stream.close  endend

curl

$ curl -i -N http://localhost/stream/helloHTTP/1.1 200 OKServer: nginxDate: Wed, 29 Jul 2015 09:15:43 GMTContent-Type: text/event-streamTransfer-Encoding: chunkedConnection: keep-aliveX-Frame-Options: SAMEORIGINX-XSS-Protection: 1; mode=blockX-Content-Type-Options: nosniffCache-Control: no-cacheX-Request-Id: 41e80567-d792-4a48-9ec3-c661aa056081X-Runtime: 0.062282Vary: Origindata: Hello World!!data: Hello World!!data: Hello World!!data: Hello World!!data: Hello World!!data: Hello World!!data: Hello World!!data: Hello World!!data: Hello World!!data: Hello World!!