Vernik yasağı eklendi ancak eski nesne döndürüldü

Jan 08 2021

Mapbox döşemelerini önbelleğe almak için bir döşeme sunucusunun önünde vernik kullanıyorum. Eski döşemeleri kaldırmak için, çok sayıda önbelleğe alınmış döşemeyi etkili bir şekilde kaldırmak için yasakları kullanmayı amaçladım. Benim sorunum, verniğin hala önbelleğe alınan nesneleri kullanması (en azından ageyanıtta bunu gösteriyor) ve arka uçla bağlantı kurmaması.

Önce http: //varnish/5/3/4.pbf, ardından curl -X BAN -H 'X-Purge-Regex: 5/3/4.pbf' varnishveya alternatif olarak bir ban ekliyorum varnishadmve sonra ban obj.http.url ~ 5/3/4.pbftekrar http: //varnish/5/3/4.pbf talep ediyorum.

Başlangıçta yasak listem boş:

Present bans:
1610117471.434488     1 C

Yasak ile başarıyla eklendi 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>

ve yasak listesinde görünür

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

Tekrar http: //varnish/5/3/4.pbf talep ettikten sonra, ban listesi yasağın kullanıldığını gösterir

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

ancak yanıtın yaşı 0 değil, çünkü yine de ilk istekteki nesnedir.

Kısa bir süre sonra yasak kaldırılır:

Present bans:
1610117471.434488     1 C  

Benim vcl_recvgibi görünüyor ama hata muhtemelen başka bir yerdedir, çünkü aynı zamanda çalışmaz 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);
                }
        }
}

Ben de vcl_purgeşuradan kullanmayı denedimhttps://stackoverflow.com/a/61507014 ancak bu yasaklar için yardımcı görünmüyor (?).

X-Purge-RegexBaşlığı, içindeki gibi özel karakterlerden kaçmak zorunda kalmayacağımı düşünmek için kullanıyorum .https://stackoverflow.com/a/38526921ama sadece bir yasak obj.http.url ~ 0işe yaramıyor.

Vcl 4.0 ile vernik 6.5 kullanıyorum.

Yasaklama isteği

*   << 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            

Yasak ekledikten sonra GET

*   << 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  

Sorunun yeniden oluşturulması

Hatayı yeniden oluşturmak için:

  • git clone https://github.com/Baschdl/varnish-ban-setup.git && cd varnish-ban-setup
  • docker-compose up
  • Http: // localhost'u açın: 8092/5/3 / 1.pbf
  • docker-compose exec varnish varnishadm ban obj.http.url ~ pbf
  • Http: // localhost: 8092/5/3 / 1.pbf'yi tekrar açın ve eski nesneyi alacaksınız

Yanıtlar

2 ThijsFeryn Jan 09 2021 at 00:23

obj.http.url ~ 5/3/4.pbfEğer yayımlıyoruz yasaklama, eşleştirme urlyanıt başlığı.

Unutmayın: URL bir istek başlığıdır, bir yanıt başlığı değildir. Panik yapmaya gerek yok, yaptığınız şey mükemmel bir anlam ifade ediyor ve sözde ban pusu kurucusunun kapsamıyla ilgili .

Ban pusuda

Ban lurker uyumsuz önbellekten nesnelerin desenleri kaldırmak için yasakları yasağı listesi ve maçları nesneler üzerinde yasakları işleyen bir iplik.

Ban lurker, bir istek kapsamında çalışmaz, ancak yalnızca nesne kapsamının farkındadır.

İstek bilgilerini başarılı bir şekilde eşleştirmek için, istek içeriği bir yanıt başlığı olarak eklenebilir. Ve bu senin aracılığıyla yaptığın şeyobj.http.url

Öyleyse yasak neden işe yaramıyor?

Yasaklamanızın çalışmamasının nedeni obj.http.url, VCL dosyanızda ayarlamamış olmanızdır . Sonuç olarak, ban pusuda herhangi bir nesneyi eşleştiremez.

Sorun nasıl giderilir

Çözüm basit: Eksik üstbilgileri arka uç yanıtı bağlamında aşağıda gösterildiği gibi ayarlayın:

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

Arka uç yanıt verdiğinde ve nesne önbellekte depolanmadan hemen önce, eksik başlıkları ayarlayabiliriz.

Bundan sonra, ban lurker, ban ifadesini doğru nesnelerle eşleştirebilecek ve bunları önbellekten kaldırabilecektir.

Nesnelerin hemen eşleşmediğini unutmayın: yalnızca ban_lurker_agevarsayılan olarak 1 dakikaya ayarlı olan öğesine ulaştıklarında kaldırılırlar .