12

nginx をリバース プロキシとして使用しており、POST リクエストをキャッシュしたいと考えています。バックエンドは、POST 要求に対して適切なキャッシュ制御ヘッダーを返すように正しく構成されています。nginx では、次のように構成しました。

proxy_cache_methods POST;
proxy_cache_key "$request_method$request_uri$request_body";

これは、小さな HTTP POST リクエストに最適です。$request_bodyただし、大規模なリクエスト (ファイルのアップロードなど) ではが無視されているように見えることに気付き始めましたproxy_cache_key。ファイルのアップロードを含むフォームがまったく異なるデータで 2 回送信されると、nginx はキャッシュされた結果を返します。

何が原因でしょうか? 大規模な POST リクエストでも$request_body(またはのハッシュ$request_body)を使用するように nginx を構成するにはどうすればよいですか?proxy_cache_key

4

2 に答える 2

16

そのため、いつ$content_length > client_body_buffer_size、リクエストの本文がファイルと変数に書き込まれることがわかります$request_body == ""

http://mailman.nginx.org/pipermail/nginx/2013-September/040442.htmlも参照してください。

于 2013-09-24T16:00:30.293 に答える
1

proxy_cache_key 内で $request_body を使用する代わりに、より単純に $content_length を使用できます。もちろん、これには独自の制限がありますが、受け取るクエリがわかっている場合は、非常に興味深い回避策にもなります。

proxy_cache_key "$scheme$request_method$host$request_uri$content_length";

代わりに $request_body を使用して、より小さなリクエスト ペイロードに対して望ましい動作を維持することもできます。

proxy_cache_key "$scheme$request_method$host$request_uri$request_body$content_length";
于 2019-01-05T18:41:49.523 に答える