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!!