सवाल एक कैशिंग रिवर्स प्रॉक्सी के रूप में Nginx कैसे स्थापित करें?


मैंने हाल ही में सुना है कि Nginx ने अपनी रिवर्स प्रॉक्सी सुविधा में कैशिंग जोड़ दी है। मैंने चारों ओर देखा लेकिन इसके बारे में ज्यादा जानकारी नहीं मिली।

मैं अपाचे / Django के सामने एक कैशिंग रिवर्स प्रॉक्सी के रूप में Nginx स्थापित करना चाहता हूं: अपाचे में कुछ (लेकिन सभी नहीं) गतिशील पृष्ठों के लिए Nginx प्रॉक्सी अनुरोध करने के लिए, फिर जेनरेट किए गए पृष्ठों को कैश करें और उन पृष्ठों के लिए कैश से बाद के अनुरोधों को प्रस्तुत करें।

आदर्श रूप से मैं कैश को 2 तरीकों से अमान्य करना चाहता हूं:

  1. कैश किए गए आइटम पर एक समाप्ति तिथि सेट करें
  2. कैश किए गए आइटम को स्पष्ट रूप से अमान्य करने के लिए। जैसे अगर मेरे Django बैकएंड ने कुछ डेटा अपडेट किया है, तो मैं प्रभावित पृष्ठों के कैश को अमान्य करने के लिए Nginx को बताना चाहता हूं

क्या ऐसा करने के लिए Nginx सेट करना संभव है? कैसे?


139
2018-06-24 01:35


मूल




जवाब:


मुझे नहीं लगता कि कैश किए गए आइटमों को स्पष्ट रूप से अमान्य करने का एक तरीका है, लेकिन यहां बाकी उदाहरणों का एक उदाहरण दिया गया है। अद्यतन करें: जैसा कि एक अन्य जवाब में पियटर ने उल्लेख किया है, वहां एक है कैश शुद्ध मॉड्यूल आप इसका उपयोग कर सकते हैं। आप nginx के proxy_cache_bypass का उपयोग कर कैश किए गए आइटम को रीफ्रेश भी कर सकते हैं - देखें चेरियन का जवाब अधिक जानकारी के लिए।

इस कॉन्फ़िगरेशन में, कैश नहीं किए गए आइटम example.net से संग्रहीत किए जाएंगे और संग्रहीत किए जाएंगे। कैश किए गए संस्करण भविष्य के ग्राहकों तक तब तक परोसे जाएंगे जब तक वे अब मान्य नहीं होते (60 मिनट)।

आपके कैश-कंट्रोल और HTTP हेडर की समयसीमा समाप्त हो जाएगी, इसलिए यदि आप स्पष्ट रूप से समाप्ति तिथि निर्धारित करना चाहते हैं, तो आप जो कुछ भी कर रहे हैं उसमें सही शीर्षलेख सेट करके आप ऐसा कर सकते हैं।

ऐसे कई पैरामीटर हैं जिन्हें आप ट्यून कर सकते हैं - इसमें सभी के बारे में अधिक जानकारी के लिए nginx प्रॉक्सी मॉड्यूल दस्तावेज़ देखें, जिसमें विभिन्न सेटिंग्स / पैरामीटर के अर्थ के विवरण शामिल हैं: http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}

94
2017-09-23 20:01



यह नए ऐप्स के लिए एक उचित पहला कदम है जिसमें 20k / req / s नहीं है। - Barry
@ बेरी दूसरा स्टीप क्या होगा? - Jürgen Paul
@ लेजिट - मुझे नहीं पता, लेकिन परंपरागत रूप से अंतिम चरण "लाभ" है :-) - Stephen C
अफसोस की बात है, यह nginx 1.11 के साथ काम नहीं करता है। चूंकि आखिरी अपडेट लगभग 3 साल पहले था, ऐसा लगता है कि यह अब समाधान नहीं है। - izogfif


आप विशेष रूप से कर सकते हैं कैश अवैध करें के माध्यम से पेज

proxy_cache_bypass       

मान लें कि आप एक पेज कैश करना चाहते हैं, इस तरह कैश सेट करें

location = /pageid {
  proxy_pass http://localhost:82;
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

अब, जब आप चाहते हैं उस पृष्ठ को अमान्य करें और फिर कैश करें 

हेडर के साथ एक गुप्त कर्ल कॉल करें

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

यह अमान्य हो जाएगा और इसे कैश करेगा।

Nginx 0.7 से काम करता है।

एक अतिरिक्त बोनस के रूप में add_header X-Cache-Status यह जांचने के लिए इस्तेमाल किया जा सकता है कि पृष्ठ कैश से है या नहीं।


46
2017-11-26 04:00



यह केवल तभी पृष्ठों को अपडेट कर सकता है जब नया पृष्ठ कैश करने योग्य भी हो। यदि आपने एक पृष्ठ हटा दिया है (404 या अन्य त्रुटियों को अब बैकएंड द्वारा परोसा जाता है), पृष्ठ अब सेट-कुकी या "सामग्री-नियंत्रण: निजी" शीर्षलेख भेजता है, तो कैश की गई सामग्री "अवैध" नहीं होगी। - rbu


मेरा सुझाव है कि आप दें वार्निश एक कोशिश। वार्निश विशेष रूप से रिवर्स प्रॉक्सी कैश के रूप में डिज़ाइन किया गया है। यह मूल सर्वर से भेजे गए सभी कैश नियंत्रण शीर्षकों का सम्मान करेगा, जो आपके पहले अनुरोध को पूरा करते हैं।

आपके दूसरे अनुरोध के लिए, स्पष्ट अमान्यता। मेरी मजबूत अनुशंसा उस संसाधन के यूआरएल का नाम बदलना है जिसे आप अमान्य करना चाहते हैं, या तो फाइल का नाम बदलकर या क्वेरी स्ट्रिंग कैश बस्टर के कुछ रूपों का उपयोग करके। वार्निश में एक है PURGE ऑपरेशन जो वार्निश के कैश से संसाधन को हटा देगा, लेकिन यह आपको और उपयोगकर्ता के बीच किसी भी अन्य कैश पर नियंत्रण नहीं देगा। जैसा कि आपने कहा है कि आप स्पष्ट रूप से संसाधन को शुद्ध करना चाहते हैं, तो मानक http नियंत्रण शीर्षलेख आपकी सहायता नहीं करेंगे। उन मामलों में संसाधन के कैशिंग को हराने के लिए सबसे मूर्ख तरीका इसका नाम बदलना है।


36
2018-06-24 02:43



क्या आप समझा सकते हैं कि "फ़ाइल का नाम बदलने या क्वेरी स्ट्रिंग कैश बस्टर के कुछ रूपों का उपयोग करके" का क्या अर्थ है? मुझे यकीन नहीं है कि मैं समझता हूं कि ऑपरेशन का उपयोग करना क्यों अच्छा नहीं है। - Continuation
वार्निश के लिए +1। नौकरी के लिए सही उपकरण का उपयोग करना हमेशा बेहतर होता है। - Tom O'Connor
@below: प्रदर्शन और बहुमुखी प्रतिभा के क्षेत्र में वार्निश को छूने की लगभग कोई उम्मीद नहीं है। इसका नेतृत्व लीड फ्रीबीएसडी कर्नेल डेवलपर्स और यूरोप में स्थित एक समर्पित टीम द्वारा किया जाता है। वार्निश ट्विटर, हेरोकू और कई अन्य में उत्पादन में है। - Barry
कैश-बस्टर का सबसे सरल उदाहरण एक स्टैटिक संसाधन में एक क्वेरी स्ट्रिंग में एक संस्करण संख्या जोड़ना है, इसलिए style.css style.css बन जाता है? 123। जब आप फ़ाइल का एक नया संस्करण धक्का देना चाहते हैं तो आप संसाधन का यूआरएल style.css में बदलते हैं? 124 और अब कैश अलग-अलग कैश किए जाने के लिए पूरी तरह से नई संपत्ति के रूप में इसे उठाएंगे। अपाचे फ़ाइल शैली.css को किसी भी क्वेरी स्ट्रिंग के साथ प्रस्तुत करेगा, इसलिए वास्तविक फ़ाइल में कोई बदलाव आवश्यक नहीं है। - chmac
यदि संभव हो, तो कैश बस्टर को फ़ाइल नाम में स्वयं रखना सबसे अच्छा है, जैसे कि style.v123.css क्योंकि कुछ कैश उन प्रश्नों को कैश नहीं करेंगे जिनके पास क्वेरी स्ट्रिंग है। - Noah McIlraith


चयनित पृष्ठों को अमान्य करने के लिए आप nginx-0.8.x के लिए "cache_purge" पैच का उपयोग कर सकते हैं जो आप चाहते हैं कि exacly करता है;)

यह उपलब्ध है यहाँ


7
2017-11-17 07:38





अधिकांश कैशिंग टूल (साइट्रिक्स) कैश किए गए पृष्ठ को दोबारा लगाने के लिए बल-रीफ्रेश (Ctrl + r) की अनुमति देते हैं।

यहां एक चाल है जिसे मैंने nginx में कुछ ऐसा करने के लिए पाया है।

server  {
        # Other settings
        proxy_pass_header       Set-Cookie; # I want to cache logged-in users
        proxy_ignore_headers    X-Accel-Redirect;
        proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        if ($http_cache_control ~ "max-age=0") {set $eac 1;}
        proxy_cache_bypass $eac;
}

यह मानता है कि जब आप अपने ब्राउज़र में Ctrl + r करते हैं, तो कैश-कंट्रोल हेडर में अधिकतम अनुरोध = 0 है। मुझे पता है क्रोम यह करता है, लेकिन मैंने अन्य ब्राउज़रों में कोशिश नहीं की है। अधिक हेडर फ़ील्ड जोड़ना आसान हो सकता है, अगर सेट किए गए बयान में अधिक जोड़कर $eac चर 1 से।


6
2018-04-10 23:02





कैशिंग nginx में बहुत नया फ़ंक्शन है (और अब के लिए बहुत अच्छी तरह से प्रलेखित नहीं है), लेकिन उत्पादन में उपयोग करने के लिए पर्याप्त स्थिर है।


4
2018-06-24 02:25





मेरा मानना ​​है NginxHttpProxyModule http अनुरोधों को पकड़ने में सक्षम है। इसके साथ शुरू निर्देशों की तलाश करें:

proxy_cache

हां, निर्देशों के माध्यम से कैश व्यवहार को नियंत्रित करना संभव है जैसे:

proxy_cache_valid

3
2018-06-24 10:12





इस तथ्य के आधार पर कि आप इस पर दस्तावेज़ नहीं ढूंढ सकते हैं, मैं उत्पादन में इस पर भरोसा करने के बारे में थोड़ा सावधान रहूंगा। क्या आपने वार्निश माना है? यह मेरा "रिवर्स प्रॉक्सी का nginx" है, छोटा, हल्का वजन, एक नौकरी कर रहा है और इसे अच्छी तरह से कर रहा है।


2
2018-06-24 01:38



यह दस्तावेज यहां है: wiki.nginx.org/NginxHttpProxyModule#proxy_cache - rmalayter


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


1
2017-11-16 15:20



वास्तव में? ऐसा लगता है जैसे नग्गिक्स एटैग से मेल खाता है और यह पता लगाने के लिए कभी भी एप्लिकेशन से बात नहीं करता है कि कोई अपडेटेड ईटैग है या नहीं। - John Naegle