2014-09-04 20 views
7

Ho seguito il Railscast 401-ActionController-Live e questo Blog Post su Server-Sent-Events per impostare qualcosa di simile nella mia app Rails. Funziona perfettamente quando apro le connessioni al server quando uso solo puma ma con puma + nginx, la connessione si chiude dopo che il primo blocco di dati è stato inviato.SSE/EventSource si chiude dopo il primo blocco di dati (Rails 4 + Puma + Nginx)

Ho provato anche a seguito delle soluzioni fornite in queste domande, ma non ha funzionato per me:

Questo è quello che sto ottenendo:

Curl response

Questo è How I set up my Server e questa è la mia attuale configurazione nginx:

upstream puma { 
    server unix:///home/deploy/apps/outy/shared/tmp/sockets/outy-puma.sock; 
    keepalive 16; 
} 

server { 
    listen 80 default_server deferred; 

    root /home/deploy/apps/outy/current/public; 
    access_log /home/deploy/apps/outy/current/log/nginx.access.log; 
    error_log /home/deploy/apps/outy/current/log/nginx.error.log info; 

    location ^~ /assets/ { 
    gzip_static on; 
    expires max; 
    add_header Cache-Control public; 
    } 

    try_files $uri/index.html $uri @puma; 
    location @puma { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 

    proxy_pass http://puma; 

    proxy_http_version 1.1; 
    proxy_set_header Connection ""; 
    proxy_buffering off; 
    proxy_cache off; 
    } 

    error_page 500 502 503 504 /500.html; 
    client_max_body_size 10M; 
    keepalive_timeout 10; 
} 
+0

State a risolvere il problema con esso? – arturtr

+0

@arturtr no, non sono ancora riuscito a risolvere questo problema – Sheharyar

risposta

1

voglio condividere la configurazione che ha funzionato.

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; 
    } 
} 

regolatore

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

ricciolo

$ curl -i -N http://localhost/stream/hello 
HTTP/1.1 200 OK 
Server: nginx 
Date: Wed, 29 Jul 2015 09:15:43 GMT 
Content-Type: text/event-stream 
Transfer-Encoding: chunked 
Connection: keep-alive 
X-Frame-Options: SAMEORIGIN 
X-XSS-Protection: 1; mode=block 
X-Content-Type-Options: nosniff 
Cache-Control: no-cache 
X-Request-Id: 41e80567-d792-4a48-9ec3-c661aa056081 
X-Runtime: 0.062282 
Vary: Origin 

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

data: Hello World!! 
+0

In questa risposta, la riga chiave nella configurazione di nginx è "proxy_http_version 1.1;", il resto era facoltativo, almeno nella mia configurazione –