कैश को बायपास करने के लिए यदि अपस्ट्रीम ऊपर है (अधिकतम आयु 1) और कैश का उपयोग करें यदि नीचे (proxy_cache_use_stale) मैंने निम्नलिखित कॉन्फिगर बनाया है:

proxy_cache_path   /app/cache/ui levels=1:2 keys_zone=ui:10m max_size=1g inactive=30d;
server {
    ...
    location /app/ui/config.json {
        proxy_cache ui;
        proxy_cache_valid 1d;
        proxy_ignore_headers Expires;           
        proxy_hide_header Expires;
        proxy_hide_header Cache-Control;
        add_header Cache-Control "max-age=1, public";
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        add_header X-Cache-Status $upstream_cache_status;
        add_header X-Cache-Date $upstream_http_date;
        proxy_pass http://app/config.json;
    }
}

लेकिन अपस्ट्रीम डाउन होने पर कैश का उपयोग नहीं किया जाता है और क्लाइंट को केवल 504 गेटवे टाइमआउट मिलता है। मैं पहले ही निम्नलिखित लेख पढ़ चुका हूँ:

https://nginx.org/ru/docs/http/ngx_http_proxy_module.html#proxy_cache_use_stale

बैकएंड के डाउन होने पर ही कैश्ड कंटेंट परोसने के लिए NginX को कैसे कॉन्फ़िगर करें (5xx रिस्पॉन्स कोड)?

https://serverfault.com/questions/752838/nginx-use-proxy-cache-if-backend-is-down

और यह मेरी अपेक्षा के अनुरूप काम नहीं करता है। किसी भी मदद की सराहना की जाती है।

6
Anatoli 5 सितंबर 2018, 19:21

3 जवाब

सबसे बढ़िया उत्तर

आइए दो सर्वरों के साथ वास्तव में सरल सेटअप पर चर्चा करें। एक चल रहा apache2 एक साधारण html पृष्ठ परोस रहा है। दूसरा चल रहा nginx जो पहले वाले पर प्रॉक्सी को उलट देता है।

http {
[...]

  proxy_cache_path /var/lib/nginx/tmp/proxy levels=2:2 keys_zone=one:10m inactive=48h max_size=16g use_temp_path=off;

  upstream backend {
    server foo.com;
  }

  server {
  [...]
    location / {
      proxy_cache           one;
      proxy_cache_valid     200 1s;
      proxy_cache_lock      on;

      proxy_connect_timeout 1s;
      proxy_cache_use_stale error timeout updating http_502 http_503 http_504;

      proxy_pass http://backend/
    }
  }
}

यह सेटअप मेरे लिए काम करता है। सबसे महत्वपूर्ण अंतर है proxy_cache_valid 200 1s; इसका मतलब है कि केवल http कोड 200 के साथ प्रतिक्रियाएं कैश की जाएंगी, और केवल 1 सेकंड के लिए मान्य होंगी। जिसका अर्थ यह है कि किसी निश्चित संसाधन के लिए पहला अनुरोध बैकएंड से प्राप्त होगा और कैश में डाल दिया जाएगा। उसी संसाधन के लिए कोई और अनुरोध कैश से पूरे एक सेकंड के लिए परोसा जाएगा। उसके बाद पहला अनुरोध फिर से बैकएंड पर जाएगा, आदि।

proxy_cache_use_stale आपके परिदृश्य का महत्वपूर्ण हिस्सा है। यह मूल रूप से कहता है कि किन मामलों में इसे अभी भी कैश्ड संस्करण की सेवा करनी चाहिए, हालांकि proxy_cache_valid द्वारा निर्दिष्ट समय पहले ही बीत चुका है। तो यहां आपको यह तय करना होगा कि आप किन मामलों में अभी भी कैश से सेवा करना चाहते हैं।

निर्देश के पैरामीटर for . के समान हैं proxy_next_upstream .

आपको इनकी आवश्यकता होगी:

error: यदि सर्वर अभी भी चालू है, लेकिन प्रतिसाद नहीं दे रहा है, या सही ढंग से प्रतिसाद नहीं दे रहा है।

timeout: सर्वर से कनेक्ट करना, अनुरोध करना या प्रतिक्रिया समय समाप्त। यही कारण है कि आप proxy_connect_timeout को कुछ कम पर सेट करना चाहते हैं। डिफ़ॉल्ट 60 के दशक का है और अंतिम उपयोगकर्ता के लिए लंबा रास्ता तय करता है।

updating: पहले से ही नई सामग्री के लिए अनुरोध किया जा रहा है। (वास्तव में आवश्यक नहीं है लेकिन प्रदर्शन के दृष्टिकोण से बेहतर है।)

http_xxx पैरामीटर आपके लिए बहुत कुछ नहीं करने जा रहे हैं, जब वह बैकएंड सर्वर डाउन हो जाता है तो आपको इनमें से किसी भी कोड के साथ कभी भी प्रतिक्रिया नहीं मिलेगी।

मेरे वास्तविक जीवन के मामले में हालांकि बैकएंड सर्वर भी nginx है जो स्थानीयहोस्ट पर विभिन्न बंदरगाहों के लिए प्रॉक्सी है। तो जब nginx ठीक चल रहा हो, लेकिन उनमें से कोई भी बैकएंड पैरामीटर http_502, http_503 और http_504 से नीचे है, तो उपयोगी छोड़ दिया जाता है, क्योंकि ये ठीक वही http कोड हैं जो मुझे प्राप्त होंगे।

http_403, http_404 और http_500 मैं कैश से सेवा नहीं देना चाहता। जब कोई फ़ाइल निषिद्ध (403) या अब बैकएंड (404) पर नहीं होती है या जब कोई स्क्रिप्ट गलत हो जाती है (500) तो इसका एक कारण होता है। लेकिन इस पर मेरा विचार है।

7
RemyNL 11 सितंबर 2018, 12:27
proxy_connect_timeout और proxy_cache_use_stale timeout ने मेरी मदद की और अब मुझे वह मिल गया जो मैं शुरू में चाहता था। बहुत - बहुत धन्यवाद!
 – 
Anatoli
11 सितंबर 2018, 15:51

यह, इससे जुड़े अन्य समान प्रश्नों की तरह, XY समस्या के उदाहरण हैं।

एक उपयोगकर्ता एक्स करना चाहता है, गलत तरीके से मानता है कि समाधान वाई है लेकिन वाई नहीं कर सकता है और इसलिए वास्तव में एक्स के बारे में पूछने के बजाय वाई कैसे करना है, इस पर मदद मांगता है। यह हमेशा उत्तर देने की कोशिश करने वालों के लिए समस्याएं पैदा करता है।

इस मामले में, वास्तविक समस्या, एक्स, यह प्रतीत होती है कि आप अपने बैकएंड के लिए एक विफलता चाहते हैं, लेकिन एक अलग सर्वर इंस्टेंस पर पैसा खर्च करने से बचना चाहेंगे और यह जानना चाहेंगे कि कौन से विकल्प उपलब्ध हैं।

इसके लिए कैश का उपयोग करने का विचार पूरी तरह से बंद नहीं है, लेकिन आपको कैश को एक फेलओवर सर्वर की तरह सेट करना होगा, जिसका अर्थ है कि इसे बैकएंड से पूरी तरह से अलग और स्वतंत्र सिस्टम होना चाहिए। यह proxy_cache को रद्द कर देता है जो कि बैकएंड से घनिष्ठ रूप से जुड़ा हुआ है।

आपके जूते में, मैं एक memcached सर्वर स्थापित करूंगा और इसे आपकी सामग्री को कैश करने के लिए कॉन्फ़िगर करूंगा लेकिन आमतौर पर 50x त्रुटि को छोड़कर आपके अनुरोधों की सेवा नहीं करूंगा।

एक memcached मॉड्यूल है जो Nginx के साथ आता है जिसे संकलित और उपयोग किया जा सकता है लेकिन इसमें memcached में आइटम जोड़ने की सुविधा नहीं है। आपको इसे Nginx के बाहर करना होगा (आमतौर पर आपके बैकएंड एप्लिकेशन में)।

मेम्कैश्ड अप सेट करने के लिए एक गाइड can यहां पाया जा सकता है या बस एक वेब खोज करें। एक बार जब यह चल रहा हो और चल रहा हो, तो यह आपके लिए Nginx की तरफ काम करेगा:

server {
    location / {
        # You will need to add items to memcached yourself here
        proxy_pass             http://backend;
        proxy_intercept_errors on
        error_page             502 504 = @failover;
    }

    location @failover {
        # Assumes memcached is running on Port 11211
        set            $memcached_key "$uri?$args";
        memcached_pass host:11211;
    }
}      

OpenResty का तीसरा पक्ष memc मॉड्यूल सीमित मानक memcached मॉड्यूल से कहीं बेहतर है जो अनुमति देता है आप सीधे Nginx में सामान जोड़ने के लिए।

OpenResty में बहुत लचीला lua-resty-memcached भी है जो वास्तव में सबसे अच्छा विकल्प है।

दोनों उदाहरणों के लिए, आपको उन्हें अपने Nginx में संकलित करना होगा और खुद को परिचित करना होगा कि उन्हें कैसे सेट किया जाए। अगर आपको इसके लिए मदद चाहिए, तो यहां OpenResty टैग के साथ एक नया प्रश्न पूछें या OpenResty सपोर्ट सिस्टम को आजमाएं।

सारांश

  1. आपको वास्तव में एक फेलओवर सर्वर की आवश्यकता है।
  2. इसे बैकएंड से अलग और स्वतंत्र होना चाहिए।
  3. आप इस रूप में कैशिंग सिस्टम का उपयोग कर सकते हैं लेकिन यह proxy_cache नहीं हो सकता है यदि आप कम से कम 1 सेकंड के लिए कैश्ड परिणाम प्राप्त करने के साथ नहीं रह सकते हैं।
  4. ऐसा करने के लिए आपको एक विशिष्ट Nginx स्थापना का विस्तार करने की आवश्यकता होगी।
2
Dayo 8 सितंबर 2018, 10:03
आपके उत्तर के लिए धन्यवाद, लेकिन मेरे पास अभी भी एक प्रश्न है कि प्रारंभिक कॉन्फ़िगरेशन में क्या गलत है और यह काम क्यों नहीं करता है।
 – 
Anatoli
10 सितंबर 2018, 12:45

यह काम नहीं कर रहा है क्योंकि http_500, http_502, http_503, http_504 कोड बैकएंड से अपेक्षित हैं। आपके मामले में 504 nginx कोड है। तो आपके पास निम्नलिखित होना चाहिए:

proxy_connect_timeout 10s;
proxy_cache_use_stale ... timeout ...

या

proxy_cache_use_stale ... updating ...

अथवा दोनों।

0
Andrey Nehaychik 9 जुलाई 2021, 18:47