Nginxはデータをキャッシュしません


15

nginxプロキシの背後にREST APIがあります。プロキシは正常に機能しますが、応答をキャッシュできません。どんな助けも大歓迎です:

Nginxの構成:

worker_processes  10;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
        proxy_cache_path /path/to/cache/dir keys_zone=one:60m;
        proxy_cache_methods GET HEAD POST;

     upstream backend {
        server server1 backup;
        server server2 weight=5;
    }
    access_log  logs/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       7076;
        server_name  localhost;
        #charset koi8-r;
        access_log  logs/host.access.log;

        location / {
            add_header 'Access-Control-Allow-Origin' *;
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Headers' 'Content-Type,Accept';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

            proxy_cache one;
            proxy_cache_key $host$uri$is_args$args;

            add_header X-Proxy-Cache $upstream_cache_status;

            proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
            proxy_ignore_headers Set-Cookie;
            proxy_ignore_headers Cache-Control;

            proxy_hide_header Cache-Control;
            proxy_hide_header Set-Cookie;
            proxy_pass http://backend;
        }
    }
}

試したことに関わらず、Proxy-Cacheは常にMISSとして返されます。

要求ヘッダーは次のとおりです。

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:nginxserver:portnumber
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36

応答ヘッダーは次のとおりです。

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Content-Type,Accept
Access-Control-Allow-Methods:GET, POST, OPTIONS
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Type:text/plain;charset=UTF-8
Date:Wed, 15 Oct 2014 16:30:18 GMT
Server:nginx/1.7.4
Transfer-Encoding:chunked
X-Proxy-Cache:MISS

私の疑いは、それがクライアントヘッダーを備えたものであるということですが、curlを介して呼び出しを発行し、ヘッダーをチェックアウトしても、応答がありません。

前もって感謝します


1
リクエストヘッダー:Cache-Control:max-age=0...「このリクエストをキャッシュしない」ことを意味します。
ネイサンC 14年

クライアントヘッダーでそれを無視する方法はありますか?それはカール経由のどちらか....かかわらず、仕事をしない理由を説明しません
user2630270

@ user2630270初期リクエストURLとメソッドは何ですか?中間応答とは何ですか?
ザビエルルーカス14年

@XavierLucas上記のヘッダーのメソッドは、Chromeの問題のトラブルシューティングを行っているため、GETです。要求は、nginxserver:port / solr / asd / select?q = *:* の行に沿ったものです。中間応答をキャプチャする方法がわかりません。これに関する指示はどこにありますか?
user2630270 14年

まったく同じクエリでnginxを経由せずにアプリケーションを直接ヒットすると、次の応答ヘッダーが表示されます
。Content

回答:


44

応答が有効であり、キャッシュから提供する必要がある時間をnginxに伝えませんでした。

これはproxy_cache_validディレクティブで指定する必要があります。

proxy_cache one;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 10m;

ただし、同じコンテンツがない場合、同じURL上の別のPOSTリクエストとは異なるキャッシュキーがないため、これはPOSTリクエストでは機能しません。

したがって、キャッシュキーをに調整する必要があります$host$request_uri|$request_body。キャッシュサイズ(proxy_cache_pathパラメーターmax_size)とプロキシ応答バッファーを監視してproxy_buffer_size、ニーズに合うようにする必要があります。


いいね、ありがとう!動いた。それがどこかにもう少し明確に文書化されたことを願っています。
user2630270 14年

このディレクティブが設定されていない場合、応答はキャッシュされます。ただし、アプリのヘッダーX-Accel-Expire、Cache-Control、またはExpireによってオーバーライドされます。少なくとも、Set-CookieとVaryはキャッシュを回避できます。これらの事実はドキュメントで公開されています。私のフレームワークであるLaravelは常に上記のヘッダーを送信するため、簡単なテスト用のスクリプトを作成しました。
ビクター

15

From:http : //nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid

構文:proxy_cache_valid [code ...] time;

...

キャッシュのパラメーターは、応答ヘッダーで直接設定することもできます。これは、ディレクティブを使用したキャッシュ時間の設定よりも優先度高くなります

  • 「X-Accel-Expires」ヘッダーフィールドは、応答のキャッシュ時間を秒単位で設定します。ゼロの値は、応答のキャッシュを無効にします。値が@プレフィックスで始まる場合、エポックからの絶対時間を秒単位で設定します。この時間までに応答がキャッシュされます。
  • ヘッダーに「X-Accel-Expires」フィールドが含まれていない場合、キャッシュのパラメーターはヘッダーフィールド「Expires」または
    「Cache-Control」で設定できます。
  • ヘッダーに「Set-Cookie」フィールドが含まれている場合、そのような応答はキャッシュされません。
  • ヘッダーに特別な値「*」を持つ「Vary」フィールドが含まれている場合、そのような応答はキャッシュされません(1.7.7)。ヘッダーに
    別の値を持つ「Vary」フィールドが含まれている場合、そのような応答は
    、対応する要求ヘッダーフィールド(1.7.7)を考慮してキャッシュされます。

これらの応答ヘッダーフィールドの1つ以上の処理は、proxy_ignore_headersディレクティブを使用して無効にできます。

ほとんどのWebアプリはSet-Cookieヘッダーを設定するため、応答はキャッシュされません。これを修正するには、次のディレクティブを使用します。

proxy_ignore_headers Set-Cookie;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.