Puncte:1

Lacul cu autentificarea de bază returnează 401

drapel us

Am încercat să configurez Varnish pe serverul care are autentificare de bază folosind aceste soluții:

dar nu ajută. Jurnalele de lac arată încă erori 401:

varnishlog -g raw -i Backend_health

         0 Backend_health - mag2.default Încă bolnav 4--X-R- 0 5 10 0,001574 0,000000 HTTP/1,1 401 Neautorizat

Configurația My Varnish (versiunea 4.0):

vcl 4.0;

import std;
# Versiunea minimă de lac este 4.0
# Pentru descărcarea SSL, treceți următorul antet în serverul proxy sau în echilibrul de încărcare: „X-Forwarded-Proto: https”

backend implicit {
    .host = "127.0.0.1";
    .port = "8080";
    .first_byte_timeout = 600s;
    .probe = {
        .url = "/health_check.php";
        .timeout = 2s;
        .interval = 5s;
        .fereastră = 10;
        .pragul = 5;
   }
}

acl purge {
    "gazdă locală";
}

sub vcl_recv {
    dacă (! req.http.Authorization ~ "ZGV2OmRldg de bază=") {
    return(synth(401, „Restricționat”));
    }

    dacă (req.method == „PURGE”) {
        if (client.ip !~ purge) {
            return (synth(405, „Metoda nu este permisă”));
        }
        # Pentru a utiliza antetul X-Pool pentru curățarea lacului în timpul implementărilor automate, asigurați-vă că antetul X-Pool
        # a fost adăugat la răspuns în configurația serverului dvs. de backend. Acesta este folosit, de exemplu, de către
        # capistrano-magento2 bijuterie pentru curățarea conținutului vechi din lac în timpul rutinei sale de implementare.
        dacă (!req.http.X-Magento-Tags-Pattern && !req.http.X-Pool) {
            return (synth(400, "Este necesar antetul X-Magento-Tags-Pattern sau X-Pool"));
        }
        dacă (req.http.X-Magento-Tags-Pattern) {
          ban("obj.http.X-Magento-Tags ~ " + req.http.X-Magento-Tags-Pattern);
        }
        dacă (req.http.X-Pool) {
          ban("obj.http.X-Pool ~ " + req.http.X-Pool);
        }
        return (synth(200, "Purged"));
    }

    dacă (req.method != "GET" &&
        req.method != „HEAD” &&
        req.method != „PUT” &&
        req.method != „POST” &&
        req.method != „URMA” &&
        req.method != „OPȚIUNI” &&
        req.method != „ȘTERGERE”) {
          /* Non-RFC2616 sau CONNECT care este ciudat. */
          retur (conducta);
    }

    # Ne ocupăm doar de GET și HEAD în mod implicit
    if (req.method != „GET” && req.method != „HEAD”) {
        întoarcere (trece);
    }

    # Ocoliți coșul de cumpărături și finalizarea comenzii
    dacă (req.url ~ "/checkout") {
        întoarcere (trece);
    }

    # Ocoliți solicitările de verificare a stării de sănătate
    dacă (req.url ~ "/pub/health_check.php") {
        întoarcere (trece);
    }

    # Setați starea inițială de utilizare a perioadei de grație
    set req.http.grace = "niciunul";

    # normalizați adresa URL în cazul schemei și domeniului HTTP de conducere
    set req.url = regsub(req.url, "^http[s]?://", "");

    # colectează toate cookie-urile
    std.collect(req.http.Cookie);

    # Filtru de compresie. Consultați https://www.varnish-cache.org/trac/wiki/FAQ/Compression
    dacă (req.http.Accept-Encoding) {
        if (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|flv)$") {
            # Nu are rost să le comprimăm
            unset req.http.Accept-Encoding;
        } elsif (req.http.Accept-Encoding ~ "gzip") {
            set req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate" && req.http.user-agent !~ "MSIE") {
            set req.http.Accept-Encoding = "dezumflare";
        } altfel {
            # algoritm necunoscut
            unset req.http.Accept-Encoding;
        }
    }

    # Eliminați toți parametrii de marketing pentru a minimiza obiectele din cache
    if (req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|fbclid|mc_[a-z]+|utm_[a-z]+|_bta_[a-z]+)=" ) {
        set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|fbclid|mc_[a-z]+|utm_[a-z]+|_bta_[a-z]+)=[- _A-z0-9+()%.]+&?", "");
        set req.url = regsub(req.url, "[?|&]+$", "");
    }

    # Memorarea în cache a fișierelor statice
    dacă (req.url ~ "^/(pub/)?(media|static)/") {
        # Fișierele statice nu ar trebui să fie memorate în cache în mod implicit
        întoarcere (trece);

        # Dar dacă utilizați câteva localități și nu utilizați CDN, puteți activa stocarea în cache a fișierelor statice, comentând linia anterioară (#return (pass);) și decomentând următoarele 3 rânduri
        #unset req.http.Https;
        #unset req.http.X-Forwarded-Proto;
        #unset req.http.Cookie;
    }

     # Solicitările GraphQL autentificate nu ar trebui să fie memorate în cache în mod implicit
    if (req.url ~ "/graphql" && req.http.Authorization ~ "^Bearer") {
        întoarcere (trece);
    }

unset req.http.Authorization;
    return (hash);
}

sub vcl_hash {
    dacă (req.http.cookie ~ "X-Magento-Vary=") {
        hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1"));
    }

    dacă (req.url ~ "/graphql") {
        apelați process_graphql_headers;
    }

    # Pentru a vă asigura că utilizatorii http nu văd avertismentul ssl
    dacă (req.http.X-Forwarded-Proto) {
        hash_data(req.http.X-Forwarded-Proto);
    }
    
}

sub process_graphql_headers {
    dacă (req.http.Store) {
        hash_data(req.http.Store);
    }
    dacă (req.http.Content-Currency) {
        hash_data(req.http.Content-Currency);
    }
}

sub vcl_backend_fetch {
    # autentificare cu admin:admin
    set bereq.http.Authorization = "ZGV2OmRldg de bază==";
}

sub vcl_backend_response {

    set beresp.grace = 3d;

    if (beresp.http.content-type ~ "text") {
        set beresp.do_esi = true;
    }

    if (bereq.url ~ "\.js$" || beresp.http.content-type ~ "text") {
        set beresp.do_gzip = true;
    }

    if (beresp.http.X-Magento-Debug) {
        set beresp.http.X-Magento-Cache-Control = beresp.http.Cache-Control;
    }

    # cache numai răspunsurile și 404s cu succes
    if (beresp.status != 200 && beresp.status != 404) {
        set beresp.ttl = 0s;
        set beresp.uncacheable = true;
        returnează (livrează);
    } elsif (beresp.http.Cache-Control ~ „privat”) {
        set beresp.uncacheable = true;
        set beresp.ttl = 86400s;
        returnează (livrează);
    }

    # validăm dacă trebuie să-l memorăm în cache și să împiedicăm setarea cookie-urilor
    dacă (beresp.ttl > 0s && (bereq.method == „GET” || bereq.method == „HEAD”)) {
        unset beresp.http.set-cookie;
    }

   # Dacă pagina nu poate fi stocată în cache, ocoliți lacul timp de 2 minute ca Hit-For-Pass
   dacă (beresp.ttl <= 0s ||
       beresp.http.Surrogate-control ~ „fără magazin” ||
       (!beresp.http.Surrogate-Control &&
       beresp.http.Cache-Control ~ "no-cache|no-store") ||
       beresp.http.Vary == "*") {
       # Marcați ca Hit-For-Pass pentru următoarele 2 minute
        set beresp.ttl = 120s;
        set beresp.uncacheable = true;
    }

    returnează (livrează);
}

sub vcl_deliver {
    if (resp.http.X-Magento-Debug) {
        dacă (resp.http.x-lac ~ " ") {
            set resp.http.X-Magento-Cache-Debug = "HIT";
            set resp.http.Grace = req.http.grace;
        } altfel {
            set resp.http.X-Magento-Cache-Debug = "MISS";
        }
    } altfel {
        nesetat resp.http.Vârsta;
    }

    # Nu permite browserului să memoreze fișiere non-statice.
    if (resp.http.Cache-Control !~ „privat” && req.url !~ „^/(pub/)?(media|static)/”) {
        set resp.http.Pragma = "no-cache";
        set resp.http.Expires = "-1";
        set resp.http.Cache-Control = "fără stocare, fără cache, revalidare obligatorie, vârsta maximă=0";
    }

    unset resp.http.X-Magento-Debug;
    unset resp.http.X-Magento-Tags;
    dezactivat resp.http.X-Powered-By;
    unset resp.http.Server;
    dezactivat resp.http.X-Lac;
    dezactivat resp.http.Via;
    dezactivat resp.http.Link;
}

sub vcl_hit {
    dacă (obj.ttl >= 0s) {
        # Atingeți în perioada TTL
        returnează (livrează);
    }
    dacă (std.healthy(req.backend_hint)) {
        dacă (obj.ttl + 300s > 0s) {
            # Apăsați după expirarea TTL, dar în perioada de grație
            set req.http.grace = "normal (server sănătos)";
            returnează (livrează);
        } altfel {
            # Apăsați după TTL și expirarea grației
            returnare (preluare);
        }
    } altfel {
        # serverul nu este sănătos, preluați din cache
        set req.http.grace = "nelimitat (server nesănătos)";
        returnează (livrează);
    }
}

sub vcl_synth {
  if (resp.status == 401) {
    set resp.status = 401;
    set resp.http.WWW-Authenticate = "De bază";
    returnare (livrare);
  }
}
Puncte:1
drapel in

Problema cu care te confrunți este că backend-ul tău necesită și Autentificare de bază. Când sonda de verificare a stării de sănătate interogează backend-ul, returnează a HTTP/1.1 401 Neautorizat pentru că nu ați furnizat antetul de autorizare.

Putem remedia acest lucru trimițând un antet de solicitare personalizat în sonda dvs. de backend.

Iată codul VCL:

backend implicit {
    .host = "127.0.0.1";
    .port = "8080";
    .first_byte_timeout = 600s;
    .probe = {
        .cerere =
            „HEAD /health_check.php HTTP/1.1”
            „Autorizare: ZGV2OmRldg de bază="
            „Gazdă: localhost”
            „Conexiune: închidere”
            „User-Agent: Sonda de sănătate lac”;
        .timeout = 2s;
        .interval = 5s;
        .fereastră = 10;
        .pragul = 5;
   }
}

După cum puteți vedea, trimitem următoarea solicitare HTTP către backend-ul dvs.:

HEAD /health_check.php HTTP/1.1
Autorizare: ZGV2OmRldg de bază=
Gazdă: localhost
Conexiune: aproape
Agent utilizator: Sondă de sănătate lac

Efectuăm o CAP sunați mai degrabă decât a OBȚINE, pentru că nu ne pasă de sarcina utilă, ne pasă doar de codul de stare.

presupun si eu ZGV2OmRldg de bază= este valoarea de autorizare corectă care este cerută de backend-ul dvs.

Presupunerea finală pe care o fac este că backend-ul dvs. va răspunde cu succes la o solicitare care are Gazdă: localhost antet.

Vedea https://www.varnish-software.com/developers/tutorials/vcl-backend-probe-basic-authentication/ pentru un tutorial care se potrivește cu cazul dvs. de utilizare.

Major Kuprich avatar
drapel us
Vă mulțumesc foarte mult pentru descrierea completă, acum Varnish este configurat corect cu BasicAuth :)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.