1

私のスタックは、gunicorn、gevent worker、nginx、django です。かなりの苦労の末、SSEを動作させることができました(いいえ、node.js、socket.io、tornado、twisted、nginx プッシュ モジュール、またはその他のツールを使用したくありません。上記を使用したいです)。リストされたスタック)。最終的には pubsub に redis でバックアップされたキューを使用しますが、デバッグ中は今は使用しません。

私のダミー/テスト プログラムでは、SSE を介して (テスト用にブラウザーを使用して) ブラウザー/クライアントに更新を送信することができ、タスクが完了するまでに 2 秒かかります (そこでスリープ状態にします)。期待どおりに動作します。

スリープを 60 秒以上に増やすと (つまり、更新をクライアントに送り返す頻度が減ります)、ブラウザでタイムアウトが発生します。event-stream長時間 (おそらく 5 分以上) になるコンテンツに対してタイムアウトしないように nginx に指示するにはどうすればよいですか?

私のnginx.conf:

upstream app_server {
  server 127.0.0.1:8000 fail_timeout=0;
}

server {
 listen 80 default;
 client_max_body_size 4G;
 keepalive_timeout 5;
 root /home/ubuntu/webapps/testt;
 error_log    /var/log/nginx/sse.error.log debug;

 location / {
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header Host $http_host;
   proxy_set_header Connection '';
   proxy_buffering off;
   proxy_cache off;
   proxy_http_version 1.1;
   chunked_transfer_encoding off;
   proxy_redirect off;
   if (!-f $request_filename) {
     proxy_pass http://app_server;
     break;
   }
 }
 error_page 500 502 503 504 /500.html;
 location = /500.html {
   root /path/to/app/current/public;
 }

}

サーバーからのメッセージを期待している私のクライアント:

    <script type="text/javascript">
    $(document).ready(function() {
        var source = new EventSource('/events1/');
        var events_dom = $("#events");

        source.onmessage = function(message) {
                        $('#events').append('<li>'+message.data+'</li>');
                    }
        });
    });
    </script>

URL を sse_request() にマップします。

def event_stream()
    while True:
        time.sleep(70)
        yield 'data: %s\n\n' % unicode(datetime.datetime.now())

def sse_request(request):
    return HttpResponse(
            event_stream(),
            mimetype='text/event-stream')
4

0 に答える 0