8

Unixソケットにバインドされたバックエンド(Rails with Puma)にアプリサーバーがあります。これはnginx構成の関連部分です

location /live/ {
 proxy_pass http://app; # match the name of upstream directive which is defined above
 proxy_set_header Host $host;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_redirect off;
 proxy_set_header Connection 'Upgrade';
 proxy_http_version 1.1;
 chunked_transfer_encoding off;
 send_timeout 300;
 proxy_send_timeout 300;
 keepalive_timeout 7200;
}

SSE イベントは /live/ 経由で送信されるため、このルートへのすべてのリクエストを処理するように ngix 構成を調整しました。

問題は、接続が 60 秒後に正確に閉じられることです。これが応答ヘッダーに表示されるものです

Cache-Control:no-cache
Connection:keep-alive
Content-Type:text/event-stream
Date:Mon, 04 Nov 2013 13:41:52 GMT
Server:nginx
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-Request-Id:7065a7bc-3450-4fe2-b60c-33dfa8d41951
X-Runtime:0.010852
X-UA-Compatible:chrome=1
X-XSS-Protection:1; mode=block

そのため、nginx は初期応答を閉じるように設定しているようです。keepalive_timeoutがここで機能しない理由。

nginx error.log に表示されます

2013/11/04 13:42:52 [error] 3689#0: *9 upstream timed out (110: Connection timed out)   while reading upstream, client: ......., server: myapp.com, request: "GET /live/events HTTP/1.1", upstream: "http://unix:/home/ubuntu/myapp/shared/sockets/puma.sock:/live/events", host: "myapp.com"
4

2 に答える 2