私はREST APIをnginxプロキシの背後に持っています。プロキシは正常に動作しますが、応答をキャッシュできません。どんな助けでも大歓迎です:
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経由で呼び出しを発行してヘッダーをチェックしても、応答がありません。
前もって感謝します
応答が有効であり、キャッシュから提供する必要がある時間について、nginxに通知しませんでした。
これは proxy_cache_valid
ディレクティブで指定する必要があります。
proxy_cache one;
proxy_cache_key $Host$uri$is_args$args;
proxy_cache_valid 200 10m;
ただし、これはPOSTリクエストでは機能しません。これは、同じURLでPOSTリクエストと異なるキャッシュキーがない場合、同じ内容です。
したがって、キャッシュキーを$Host$request_uri|$request_body
に調整する必要があります。必要に応じて、キャッシュサイズ(proxy_cache_path
パラメータmax_size
)とプロキシ応答バッファproxy_buffer_size
を監視する必要があります。
差出人: 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」または
「キャッシュ制御」。- ヘッダーに「Set-Cookie」フィールドが含まれている場合、そのような応答はキャッシュされません。
- ヘッダーに「Vary」フィールドと特別な値「*」が含まれている場合、そのような応答はキャッシュされません(1.7.7)。ヘッダーに含まれる場合
別の値を持つ「Vary」フィールド。このような応答はキャッシュされます
対応するリクエストヘッダーフィールドを考慮に入れる(1.7.7)。これらの応答ヘッダーフィールドの1つ以上の処理は、proxy_ignore_headersディレクティブを使用して無効にできます。
ほとんどのウェブアプリセットSet-Cookie
ヘッダーなので、応答はキャッシュされません。これを修正するには、次のディレクティブを使用します。
proxy_ignore_headers Set-Cookie;