2014-09-04 30 views
7

我跟着401-ActionController-Live Railscast和這個Blog PostServer-Sent-Events在我的Rails應用中設置了類似的東西。當我僅使用puma打開到服務器的連接時,它會很好地工作,但在puma + nginx時,連接在發送第一個數據塊後關閉。在第一批數據(Rails 4 + Puma + Nginx)後,SSE/EventSource關閉

我也試過以下這些問題提供的解決方案,但他們並沒有爲我工作:

這就是我得到:

Curl response

這是How I set up my Server,這是我目前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

你解決你的問題呢? – arturtr 2015-02-25 18:16:44

+0

@arturtr不,我仍然無法解決這個問題 – Sheharyar 2015-02-25 18:45:51

回答

1

我將共享配置奏效。

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

控制器

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 

捲曲

$ 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

在這個答案中,nginx配置中的關鍵行是「proxy_http_version 1.1;」,其餘是可選的,至少在我的設置 – 2018-02-21 07:11:23