वार्निश प्रतिबंध जोड़ा जाता है लेकिन पुरानी वस्तु वापस कर दी जाती है

Jan 08 2021

मैं एक टाइल सर्वर के सामने वार्निश का उपयोग मैपबॉक्स टाइल्स को कैश करने के लिए कर रहा हूं। पुरानी टाइलों को हटाने के लिए, मैंने बड़ी संख्या में कैश्ड टाइलों को प्रभावी ढंग से हटाने के लिए बैन का उपयोग करने का इरादा किया। मेरी समस्या यह है कि वार्निश अभी भी कैश्ड वस्तुओं का उपयोग करता है (कम से कम ageप्रतिक्रिया में यह इंगित करता है) और बैकएंड से संपर्क नहीं करता है।

मैं सबसे पहले http: //varnish/5/3/4.pbf का अनुरोध कर रहा हूं, उसके बाद curl -X BAN -H 'X-Purge-Regex: 5/3/4.pbf' varnishया वैकल्पिक रूप से एक प्रतिबंध जोड़ रहा हूं varnishadmऔर उसके ban obj.http.url ~ 5/3/4.pbfबाद http: //varnish/5/3/4.pbf का फिर से अनुरोध कर रहा हूं।

शुरुआत में मेरी प्रतिबंध सूची खाली है:

Present bans:
1610117471.434488     1 C

प्रतिबंध सफलतापूर्वक के साथ जोड़ा गया है curl -X BAN -H 'X-Purge-Regex: 5/3/4.pbf' varnish

<!DOCTYPE html>
<html>
  <head>
    <title>200 Ban added</title>
  </head>
  <body>
    <h1>Error 200 Ban added</h1>
    <p>Ban added</p>
    <h3>Guru Meditation:</h3>
    <p>XID: 8</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>

और प्रतिबंध सूची में दिखाई देता है

Present bans:
1610117369.028870     0 -  obj.http.url ~ 5/3/4.pbf
1610117307.220739     1 C  

Http: //varnish/5/3/4.pbf फिर से अनुरोध करने के बाद, प्रतिबंध सूची इंगित करती है कि प्रतिबंध का उपयोग किया गया था

Present bans:
1610117471.434488     1 -  obj.http.url ~ 5/3/4.pbf

लेकिन प्रतिक्रिया की उम्र 0 नहीं है, क्योंकि यह अभी भी पहले अनुरोध से वस्तु है।

थोड़े समय के बाद प्रतिबंध हटा दिया जाता है:

Present bans:
1610117471.434488     1 C  

मेरा vcl_recvऐसा दिखता है, लेकिन त्रुटि शायद कहीं और है क्योंकि यह भी काम नहीं करता है varnishadm:

sub vcl_recv {
    unset req.http.cookie;

    # Allowing PURGE from localhost
    if (req.method == "BAN"||req.method == "PURGE") {
                if (!client.ip ~ purge) {
                        return(synth(405,"Not allowed."));
                }
                if (req.method == "BAN") {
                    ban("obj.http.url ~ " + req.http.X-Purge-Regex);

                    # Throw a synthetic page so the
                    # request won't go to the backend.
                    return(synth(200, "Ban added"));
                }
                if (req.method == "PURGE") {
                    return (purge);
                }
        }
}

मैं भी उपयोग करने का प्रयास vcl_purgeसेhttps://stackoverflow.com/a/61507014 लेकिन यह प्रतिबंध (?) के लिए मदद नहीं लगती है।

मैं X-Purge-Regexहेडर का उपयोग कर रहा हूं , जैसे कि विशेष वर्णों से बचने के बारे में चिंता न करेंhttps://stackoverflow.com/a/38526921लेकिन सिर्फ एक प्रतिबंध की तरह obj.http.url ~ 0काम नहीं करता है।

मैं vc 4.0 के साथ वार्निश 6.5 का उपयोग कर रहा हूँ।

प्रतिबंध का अनुरोध

*   << Request  >> 54        
-   Begin          req 53 rxreq
-   Timestamp      Start: 1610121483.345437 0.000000 0.000000
-   Timestamp      Req: 1610121483.345437 0.000000 0.000000
-   VCL_use        boot
-   ReqStart       192.168.48.2 50882 http
-   ReqMethod      BAN
-   ReqURL         /
-   ReqProtocol    HTTP/1.1
-   ReqHeader      Host: varnish-volatile
-   ReqHeader      User-Agent: curl/7.64.0
-   ReqHeader      Accept: */*
-   ReqHeader      X-Purge-Regex: 0
-   ReqHeader      X-Forwarded-For: 192.168.48.2
-   VCL_call       RECV
-   VCL_acl        MATCH purge "importer"
-   VCL_return     synth
-   VCL_call       HASH
-   VCL_return     lookup
-   RespProtocol   HTTP/1.1
-   RespStatus     200
-   RespReason     Ban added
-   RespHeader     Date: Fri, 08 Jan 2021 15:58:03 GMT
-   RespHeader     Server: Varnish
-   RespHeader     X-Varnish: 54
-   VCL_call       SYNTH
-   RespHeader     Content-Type: text/html; charset=utf-8
-   RespHeader     Retry-After: 5
-   VCL_return     deliver
-   Timestamp      Process: 1610121483.347281 0.001844 0.001844
-   RespHeader     Content-Length: 246
-   Storage        malloc Transient
-   Filters        
-   RespHeader     Accept-Ranges: bytes
-   RespHeader     Connection: keep-alive
-   Timestamp      Resp: 1610121483.347557 0.002120 0.000276
-   ReqAcct        98 0 98 218 246 464
-   End            

प्रतिबंध लगाने के बाद प्राप्त करें

*   << Request  >> 32806     
-   Begin          req 32805 rxreq
-   Timestamp      Start: 1610121552.733872 0.000000 0.000000
-   Timestamp      Req: 1610121552.733872 0.000000 0.000000
-   VCL_use        boot
-   ReqStart       192.168.48.1 55176 http
-   ReqMethod      GET
-   ReqURL         /public.snow_db/0/0/0.pbf
-   ReqProtocol    HTTP/1.1
-   ReqHeader      Host: localhost:8090
-   ReqHeader      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:84.0) Gecko/20100101 Firefox/84.0
-   ReqHeader      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
-   ReqHeader      Accept-Language: en-US,en;q=0.5
-   ReqHeader      Accept-Encoding: gzip, deflate
-   ReqHeader      DNT: 1
-   ReqHeader      Connection: keep-alive
-   ReqHeader      Upgrade-Insecure-Requests: 1
-   ReqHeader      Pragma: no-cache
-   ReqHeader      Cache-Control: no-cache
-   ReqHeader      X-Forwarded-For: 192.168.48.1
-   VCL_call       RECV
-   ReqUnset       Host: localhost:8090
-   ReqHeader      host: localhost:8090
-   VCL_return     hash
-   ReqUnset       Accept-Encoding: gzip, deflate
-   ReqHeader      Accept-Encoding: gzip
-   VCL_call       HASH
-   VCL_return     lookup
-   Hit            28 601789.331504 10.000000 0.000000
-   VCL_call       HIT
-   VCL_return     deliver
-   RespProtocol   HTTP/1.1
-   RespStatus     200
-   RespReason     OK
-   RespHeader     content-encoding: gzip
-   RespHeader     content-type: application/x-protobuf
-   RespHeader     date: Fri, 08 Jan 2021 15:09:02 GMT
-   RespHeader     Vary: Accept-Encoding
-   RespHeader     X-Varnish: 32806 28
-   RespHeader     Age: 3010
-   RespHeader     Via: 1.1 varnish (Varnish/6.5)
-   VCL_call       DELIVER
-   VCL_return     deliver
-   Timestamp      Process: 1610121552.734070 0.000197 0.000197
-   Filters        
-   RespHeader     Accept-Ranges: bytes
-   RespHeader     Content-Length: 295
-   RespHeader     Connection: keep-alive
-   Timestamp      Resp: 1610121552.734217 0.000345 0.000147
-   ReqAcct        414 0 414 272 295 567
-   End  

मुद्दे को फिर से प्रस्तुत करना

बग को पुन: उत्पन्न करने के लिए:

  • git clone https://github.com/Baschdl/varnish-ban-setup.git && cd varnish-ban-setup
  • docker-compose up
  • ओपन http: // लोकलहोस्ट: 8092/5/3 / 1. पीपीबी
  • docker-compose exec varnish varnishadm ban obj.http.url ~ pbf
  • Open http: // localhost: 8092/5/3 / 1. पीपीबी फिर से और आपको पुरानी वस्तु मिल जाएगी

जवाब

2 ThijsFeryn Jan 09 2021 at 00:23

obj.http.url ~ 5/3/4.pbfप्रतिबंध है कि आप जारी कर रहे हैं, एक मिलान है urlप्रतिक्रिया हेडर।

याद रखें: URL एक अनुरोध शीर्षलेख है, प्रतिक्रिया शीर्षलेख नहीं। घबराने की कोई बात नहीं, आप जो कर रहे हैं वह सही समझ में आता है, और तथाकथित प्रतिबंध लुटेरे के दायरे से संबंधित है ।

प्रतिबंध लगाने वाला

प्रतिबंध lurker एक धागा है कि अतुल्यकालिक रूप से कैश से वस्तुओं के पैटर्न को हटाने के लिए प्रतिबंध को प्रतिबंध सूची और मैचों की वस्तुओं पर प्रतिबंध प्रक्रियाओं है।

प्रतिबंध लगाने वाला अनुरोध के दायरे में काम नहीं करता है, लेकिन केवल वस्तु गुंजाइश के बारे में पता है।

अनुरोध जानकारी का सफलतापूर्वक मिलान करने के लिए, अनुरोध संदर्भ को प्रतिक्रिया शीर्ष लेख के रूप में जोड़ा जा सकता है। और यही आप कर रहे हैंobj.http.url

तो क्यों प्रतिबंध काम नहीं करता है?

आपका प्रतिबंध काम नहीं कर रहा है, इसका कारण यह है कि आपने obj.http.urlअपनी VCL फ़ाइल में सेट नहीं किया है। नतीजतन, प्रतिबंध कर्ता इसके लिए किसी भी वस्तु से मेल नहीं खा सकता है।

समस्या को कैसे ठीक करें

समाधान सरल है: बैकएंड प्रतिक्रिया संदर्भ में लापता हेडर सेट करें, जैसा कि नीचे सचित्र है:

sub vcl_backend_response {
    set beresp.http.url = bereq.url;
    set beresp.http.host = bereq.http.host;
}

जब बैकएंड प्रतिक्रिया करता है, और ऑब्जेक्ट कैश में संग्रहीत होने से ठीक पहले, हम लापता हेडर सेट कर सकते हैं।

उसके बाद, प्रतिबंध कर्ता सही वस्तुओं पर प्रतिबंध की अभिव्यक्ति का मिलान करने में सक्षम होगा, और उन्हें कैश से हटा देगा।

यह मत भूलो कि वस्तुओं का तुरंत मिलान नहीं किया गया है: वे केवल तब तक हटा दिए जाते हैं जब वे पहुंच जाते हैं ban_lurker_age, जो डिफ़ॉल्ट रूप से 1 मिनट के लिए सेट होता है।