ロングポーリングリクエストについて明確にしたいと思います。ロングポーリング用のスクリプトを作成し、nginx(標準構成)で試してみましたが、動作します。私はいくつかのことに気づきました。60 秒後にサーバーが応答しない場合、nginx はログ ブラウザに 503 エラーを返しますが、サーバーが応答した場合に限り、リクエストを期限切れにしない (または期限切れにする必要がある) ことは可能ですか? 可能であれば、どうすればよいですか?不可能な場合は、サーバーが停止するまで (60 秒) またはそれ以前 (どのくらいの時間を示すか) にリクエストを延長することをお勧めしますか? 以前の場合、アプリケーションを終了するようにどのようにアドバイスしますか?
1 に答える
client_body_timeoutとclient_header_timeoutはおそらくあなたが探しているものです
client_body_timeout 1m; # or 60s
client_header_timeout 1m;
これらの値を必要な長さに変更しますが、より一般的に使用される方法は、たとえば 60 秒で、サーバーは空の応答を送信し (接続を終了します)、クライアントは新しい要求を再開します。これもさらに 60 秒間続きます。 ..、たとえば、ユーザーがリクエストを終了せずに実際にブラウザーを閉じた場合、タイムアウトを待っている無駄な開いている接続がたくさんあると私は信じています。
編集: nginx でリクエストを期限切れにしないでください。アプリケーションに応答を送信させてください。そうしないと、200 成功ではなく 504 エラーが発生します。たとえば、60 秒間ロング ポーリングを行いたい場合は、nginx を 90 秒または 120 秒に設定します。アプリケーションが 60 秒を超えると、空の出力を送信するか、「終了」のようなメッセージがまだないことを示すメッセージを送信する必要があります。 ' または 'stop' の場合、JavaScript は停止メッセージを受信した後に新しい要求を開始する必要があります。また、少しの JavaScript を使用すると、セパレーターなどを使用して接続を終了することなく、サーバーに複数のメッセージを送信させることができます
。Web Socketsには、現在のブラウザーでサポートされている機能を確認し、最適な機能を使用するパーサー ライブラリが多数あります。たとえば、IE でまだサポートされていないサーバー送信イベントを使用する場合は、簡単に処理できます。この例のようなもので、IE でのみロング ポーリングにフォールバックします。