वार्निश प्रतिबंध जोड़ा जाता है लेकिन पुरानी वस्तु वापस कर दी जाती है
मैं एक टाइल सर्वर के सामने वार्निश का उपयोग मैपबॉक्स टाइल्स को कैश करने के लिए कर रहा हूं। पुरानी टाइलों को हटाने के लिए, मैंने बड़ी संख्या में कैश्ड टाइलों को प्रभावी ढंग से हटाने के लिए बैन का उपयोग करने का इरादा किया। मेरी समस्या यह है कि वार्निश अभी भी कैश्ड वस्तुओं का उपयोग करता है (कम से कम 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. पीपीबी फिर से और आपको पुरानी वस्तु मिल जाएगी
जवाब
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 मिनट के लिए सेट होता है।