नग्नेक्स कैशिंग डेटा नहीं


16

मेरे पास एक nginx प्रॉक्सी के पीछे REST API है। प्रॉक्सी ठीक काम करता है, हालांकि मैं किसी भी प्रतिक्रिया को कैश करने में असमर्थ हूं। कोई भी सहायताकाफी प्रशंसनीय होगी:

नग्नेक्स विन्यास:

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;
        }
    }
}

कोई फर्क नहीं पड़ता कि मैंने क्या कोशिश की है, प्रॉक्सी-कैश हमेशा एक मिस के रूप में वापस आता है:

अनुरोध हेडर हैं:

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

मेरा संदेह यह है कि यह क्लाइंट हेडर के साथ कुछ है, लेकिन फिर भी अगर मैं कर्ल के माध्यम से कॉल जारी करता हूं और हेडर की जांच करता हूं, तो कोई प्रतिक्रिया नहीं है।

अग्रिम में धन्यवाद


1
अनुरोध शीर्षलेख में: Cache-Control:max-age=0... जिसका अर्थ है "इस अनुरोध को कैश न करें।"
नाथन सी

1
क्या क्लाइंट हेडर में मुझे अनदेखा करने का कोई तरीका है? यह व्याख्या नहीं करता है कि यह कर्ल के माध्यम से काम क्यों नहीं करता है ...
user2630270

@ user2630270 प्रारंभिक अनुरोध URL और विधि क्या है? मध्यवर्ती प्रतिक्रिया क्या है?
जेवियर लुकास

@XavierLucas ऊपर दिए गए शीर्ष लेखों की विधियाँ GET हैं क्योंकि मैं अब क्रोम के मुद्दे का निवारण कर रहा हूँ। निगंज़ेस्वर की तर्ज पर अनुरोध कुछ है : पोर्ट / सॉल / एसड / सेलेक्ट? Q = *: *। मैं मध्यवर्ती प्रतिक्रिया पर कब्जा करना नहीं जानता। मुझे इस पर निर्देश कहां मिल सकते हैं?
user2630270

यदि मैं सीधे nginx के माध्यम से जाने के बिना एप्लिकेशन को हिट करता हूं, तो उसी क्वेरी के साथ मुझे निम्नलिखित प्रतिक्रिया हेडर मिलता है: सामग्री-प्रकार: पाठ / सादा; charset = UTF-8 स्थानांतरण-एन्कोडिंग: chunked
user2630270

जवाबों:


45

आपने 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ताकि यह आपकी आवश्यकताओं के अनुरूप हो।


अच्छा, धन्यवाद आदमी! इसने काम कर दिया। काश यह कहीं और अधिक स्पष्ट रूप से प्रलेखित होता।
user2630270

यदि यह निर्देश सेट नहीं किया जाता है, तो किसी भी प्रतिक्रिया को कैश किया जाएगा। लेकिन ऐप के हेडर X-Accel-Expire, Cache-Control या Expire द्वारा इसे ओवरराइड किया जाता है। कम से कम, सेट-कुकी और वैरी कैश से बच सकते थे। इन तथ्यों को डॉक्टर में उजागर किया गया है। मैंने परीक्षण करने के लिए एक सरल स्क्रिप्ट बनाई क्योंकि मेरा ढांचा, लारवेल, हमेशा उपरोक्त हेडर भेजते हैं।
विक्टर एगुइलर

इसने Xiavier Lucas का काम किया। धन्यवाद। मैंने अलग-अलग HTTP कोड के लिए एक अंतर कैश समय मान भी जोड़ा: प्रॉक्सी_कैचे_वलिड २०० ३०२ १० मी; ////// छद्म_केच_वालिड 404 1 मी;
देउंज

16

प्रेषक: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid

सिंटैक्स: प्रॉक्सी_चेचे_वलिड [कोड ...] समय;

...

कैशिंग के पैरामीटर भी सीधे प्रतिक्रिया हेडर में सेट किए जा सकते हैं। यह निर्देशन का उपयोग करके कैशिंग समय की स्थापना की तुलना में अधिक प्राथमिकता है।

  • "X-Accel-Expires" हेडर फ़ील्ड सेकंड में प्रतिक्रिया का कैशिंग समय निर्धारित करता है। शून्य मान एक प्रतिक्रिया के लिए कैशिंग अक्षम करता है। यदि मान @ उपसर्ग के साथ शुरू होता है, तो वह एपोक के बाद से सेकंड में एक निरपेक्ष समय निर्धारित करता है, जिस पर प्रतिक्रिया को कैश किया जा सकता है।
  • यदि शीर्ष लेख में "X-Accel-Expires" फ़ील्ड शामिल नहीं है, तो कैशिंग के पैरामीटर हेडर फ़ील्ड्स "Expires" या
    "Cache-Control" में सेट किए जा सकते हैं ।
  • यदि हेडर में "सेट-कुकी" फ़ील्ड शामिल है, तो ऐसी प्रतिक्रिया को कैश नहीं किया जाएगा।
  • यदि शीर्ष लेख में "विशेष" "मान" वाला "वैरी" फ़ील्ड शामिल है, तो ऐसी प्रतिक्रिया को कैश नहीं किया जाएगा (1.7.7)। यदि हेडर में
    एक और मान के साथ "वैरी" फ़ील्ड शामिल है, तो इस तरह की प्रतिक्रिया को
    संबंधित अनुरोध हेडर फ़ील्ड (1.7%) को ध्यान में रखा जाएगा।

इन प्रतिसाद शीर्ष लेख फ़ील्ड में से एक या अधिक को संसाधित करना प्रॉक्सी_इनगोरे_हेडर्स निर्देश का उपयोग करके अक्षम किया जा सकता है ।

अधिकांश वेब ऐप्स Set-Cookieहेडर सेट करते हैं , इसलिए प्रतिक्रिया को कैश नहीं किया जाएगा। इसे ठीक करने के लिए, इस निर्देश का उपयोग करें:

proxy_ignore_headers Set-Cookie;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.