Puncte:0

Varnish uneori (până la ~5% din solicitări) declanșează err_too_many_redirects, rulând în docker combinat cu plesk pentru wordpress

drapel tf

Am urmat aceste instrucțiuni https://support.plesk.com/hc/en-us/articles/115001888894-Does-Plesk-support-Varnish- și am reușit să-l facă să funcționeze „corespunzător”, servește site-ul wordpress prin lac și viteza este uimitoare. Toate bune și bine, dar robotul nostru de funcționare raportează din când în când timpi de nefuncționare scurti (foarte neregulat, dar între 1 și 8 ori pe zi pentru o perioadă de <5 minute, în diferite momente de-a lungul zilei).

După câteva teste diferite, am observat o problemă cu adresa URL wp-admin, am ajuns la concluzia că aceasta se întâmplă din cauza DirectoryIndex-ului nostru (care este index.html în mod implicit), am rezolvat acest lucru adăugând „DirectoryIndex index.php ' la „Directivele Apache suplimentare” care au rezolvat această problemă.

Un lucru care ni s-a părut interesant este că atunci când schimbăm modul în care PHP(FPM) este servit, afectează aceeași eroare. Când servim prin NGINX, vom primi și err_too_many_redirects, dacă îl servim prin Apache, funcționează în 95% din timp.

Am adăugat câteva înregistrări (varnishncsa) mai jos, când răspunsul din antet indică 301, atunci suntem în buclă:

172.17.0.1 - - [11/Jan/2022:13:54:55 +0000] "HEAD http://[domeniul lac]/ HTTP/1.0" 200 0 "https://[domeniul lac]" " Mozilla/5.0+(compatibil; UptimeRobot/2.0; http://www.[uptimerobot].com/)"

172.17.0.1 - - [11/Jan/2022:13:56:51 +0000] „GET http://[domeniul lac]/ HTTP/1.0” 200 11184 „-” „-”

172.17.0.1 - - [11/Jan/2022:13:58:31 +0000] „HEAD http://[domeniul lac]/ HTTP/1.0” 301 0 „-” „Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, ca Gecko) Chrome/56.0.2924.76 Safari/537.36"

172.17.0.1 - - [11/Jan/2022:13:58:32 +0000] "HEAD http://[domeniul lac]/ HTTP/1.0" 301 0 "http://[domeniul lac]" " Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, ca Gecko) Chrome/56.0.2924.76 Safari/537.36"

După aceasta, înregistrăm următoarele de 8 ori: 172.17.0.1 - - [11/Jan/2022:13:58:32 +0000] „HEAD http://[domeniul lac]/ HTTP/1.0” 301 0 „https://[domeniul lac]/” „Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, ca Gecko) Chrome/56.0.2924.76 Safari/537.36”

Apoi unul: 172.17.0.1 - - [11/Jan/2022:13:58:34 +0000] „GET http://[domeniul lac]/ HTTP/1.0” 301 238 „-” „Mozilla/5.0 (X11; Linux x86_64 ) AppleWebKit/537.36 (KHTML, ca Gecko) HeadlessChrome/96.0.4664.110 Safari/537.36"

Apoi de 7 ori: 172.17.0.1 - - [11/Jan/2022:13:59:55 +0000] "HEAD http://[domeniul lac]/ HTTP/1.0" 301 0 "https://[domeniul lac]" " Mozilla/5.0+(compatibil; UptimeRobot/2.0; http://www.[uptimerobot].com/)"

Apoi de 22 de ori: 172.17.0.1 - - [11/Jan/2022:14:00:17 +0000] „GET http://[domeniul lac]/ HTTP/1.0” 301 238 „https://[domeniul lac]” „ Mozilla/5.0+(compatibil; UptimeRobot/2.0; http://www.[uptimerobot].com/)"

Apoi, imediat după aceea, totul pare din nou în regulă.

Actualizare: inspectarea jurnalelor

@thijs-feryn a subliniat ceva interesant, ceea ce ne-a făcut să concluzionam că am respins o teorie mai veche prea devreme. Din moment ce eram siguri că X-Forwarded-Proto a fost transmis, deoarece era în „configurația noastră suplimentară de antet apache”.

Cu toate acestea, după ce i-am citit cu atenție răspunsul, am aflat că, cumva, X-Forwarded-Proto nu primește toate cererile (cel puțin nu pentru cele rupte). El a subliniat că [un alt domeniu de lac] părea să treacă bine această înregistrare într-o cerere similară.

După o comparație atentă a configurațiilor, un singur lucru ne-a evidențiat, și anume că domeniul preferat în plesk pentru [un alt domeniu de lac] a fost setat la „Niciunul”, iar pentru [domeniul de lac] a fost setat la [lacul. domeniu].

Așa că am mers la www.[domeniul lac] în browserul nostru și asta a părut să declanșeze problema. Am schimbat și aici „Domeniul preferat” la „Niciunul”, iar acum www.[domeniul lac] redirecționează la [domeniul lac] foarte bine.

ipoteză

Se pare că redirecționarea proprie a Plesk ignoră „Directivele suplimentare pentru HTTP” și astfel „Vary: X-Forwarded-Proto” nu a fost adăugat. Vom monitoriza acest lucru și vom publica o actualizare în curând, când suntem pe deplin încrezători că aceasta a fost cauza.

Puncte:0
drapel in

Problema ar putea fi legată de lipsa de conștientizare a protocolului atunci când vine vorba de cache. Este destul de tipic ca o solicitare HTTP care ar trebui redirecționată către o solicitare HTTPS să ajungă în cache, care redirecționează necondiționat utilizatorii către versiunea HTTPS, chiar dacă aceștia au solicitat de fapt o versiune HTTPS.

Există mai multe modalități de a remedia acest lucru, în funcție de tipul de server web pe care îl utilizați.

ieșire varnishlog

Dar înainte să putem sări la concluzii, vreau să văd câteva vernislog ieșire.

Aș dori să văd rezultatul următoarei comenzi când are loc bucla de redirecționare:

varnishlog -g request -q "ReqUrl eq '/'"

Presupunerea este că problema apare și pe pagina de pornire pe care am adăugat-o ca interogare VSL la vernislog comanda.

ti-am observat varnishncsa ieșire, dar, din păcate, este prea limitată în ceea ce privește ieșirea. vernislog este mult mai bun pentru depanare, în timp ce varnishncsa e doar.

Testarea ipotezei

Dacă bucla de redirecționare este într-adevăr cauzată de lipsa de cunoaștere a protocolului, putem declanșa problema după cum urmează:

  • Alerga varnishadm ban obj.status "!=" 0 pentru a goli memoria cache
  • Apelați adresa URL HTTP simplă a site-ului web pentru a vă asigura că această versiune este stocată în cache
  • Apelați adresa URL HTTPS a site-ului web pentru a verifica dacă sunteți sau nu blocat în bucla de redirecționare

Remedierea problemei

Dacă toate testele se adună și ipoteza este dovedită, soluția este de fapt destul de simplă.

Dacă utilizați Apache ca server web, puteți adăuga următorul conținut la dvs .htaccess fişier:

SetEnvIf X-Forwarded-Proto „https” HTTPS=on
Adăugarea antetului Variază: X-Forwarded-Proto

În caz contrar, puteți adăuga următorul cod la fișierul VCL:

sub vcl_backend_response {
    dacă(beresp.http.Vary) {
        if(beresp.http.Vary !~ "X-Forwarded-Proto") {
            set beresp.http.Vary = set beresp.http.Vary + ", X-Forwarded-Proto";
        }
    } altfel {
        set beresp.http.Vary = "X-Forwarded-Proto";
    }
}

Adăugând X-Forwarded-Proto la Varia antetul se va asigura că Varnish creează obiecte separate în cache pentru HTTP și pentru HTTPS.

De asemenea, presupun că proxy-ul dvs. TLS trimite de fapt un X-Forwarded-Proto antet.

Actualizare: inspectarea jurnalelor

După câteva dus-întors în comentarii, am primit câteva jurnale perspicace prin intermediul https://pastebin.com/QzPh1r5R care explică ce se întâmplă.

În ** << BeReq >> 951078 poti vedea X-Forwarded-Proto: http antet. Aceasta înseamnă că solicitarea a fost trimisă printr-o solicitare HTTP simplă. Acest tip de solicitare ar trebui să aibă ca rezultat o redirecționare 301 și se face conform următoarelor linii de jurnal:

-- BerespProtocol HTTP/1.1
-- BerespStatus 301
-- BerespReason mutat definitiv
-- BerespHeader Data: joi, 13 ianuarie 2022 08:55:17 GMT
-- BerespHeader Server: Apache
-- BerespHeader Locație: https://[domeniul lac]/
-- BerespHeader Lungime conținut: 238
-- BerespHeader Content-Type: text/html; set de caractere=iso-8859-1
-- TTL RFC 120 10 0 1642064118 1642064118 1642064117 0 0 stocabil în cache

Nu numai că redirecționarea are loc, dar este și stocată în cache timp de 120 de secunde. De asemenea, este interesant de văzut că nu există Variază: X-Forwarded-Proto antet.

Mai târziu, cel * << Solicitare >> 951080 tranzacția apare în jurnalele. Vedem următoarele antete de solicitare:

- ReqHeader X-Forwarded-Proto: https
- Gazdă ReqHeader: [un alt domeniu de lac]

Deci, aceasta este o solicitare HTTPS pentru un alt domeniu Varnish și, din anumite motive, are ca rezultat o accesare în cache care returnează un Varia antet:

- RespHeader variază: Accept-Encoding, Cookie, X-Forwarded-Proto
- VCL_call HIT
- Hit 886585 90003.966201 10.000000 0.000000

Nu numai că vezi lovitura, dar poți și concluziona că obiectul a fost introdus în cache prin tranzacție 886585.

Deși este bine să ai un Varia antet, acesta conține Cookie valoare care este periculoasă.Aceasta înseamnă că un obiect separat va fi stocat în cache pentru fiecare valoare cookie posibilă care este prezentată lui Varnish. Acest lucru este destul de periculos, așa că vă rugăm să eliminați Cookie de la Varia antet și stick cu Variază: Accept-Encoding, X-Forwarded-Proto.

Ultima tranzacție la care m-am uitat este * << Solicitare >> 951082. Are o X-Forwarded-Proto: https antetul cererii și nu ar trebui să aibă ca rezultat o redirecționare 301, dar, din păcate, o face.

The Lovit eticheta expune câteva informații interesante:

- Hit 951078 82.391648 10.000000 0.000000

Obiectul care a fost lovit a fost introdus inițial în cache prin tranzacție 951078. Dacă ai fost foarte atent, acesta a fost primul pe care l-am acoperit. Această tranzacție a fost o tranzacție numai HTTP care a dus la redirecționarea 301.

Și exact acesta este obiectul care este returnat. Deci, chiar dacă solicitați conținut HTTPS, sunteți în continuare redirecționat și așa ajungeți în bucla nesfârșită.

Dacă te uiți la răspunsul care este returnat prin tranzacție 951082, nu vezi Varia antet:

- RespProtocol HTTP/1.1
- RespStatus 301
- RespReason mutat permanent
- Data RespHeader: joi, 13 ianuarie 2022 08:55:17 GMT
- Server RespHeader: Apache
- Locație RespHeader: https://[domeniul lac]/
- Lungimea conținutului RespHeader: 238
- RespHeader Content-Type: text/html; set de caractere=iso-8859-1
- RespHeader X-Lac: 951082 951078
- Vârsta RespHeader: 37
- RespHeader prin: 1.1 lac (Lac/7.0)

Concluzie: vă rugăm să vă asigurați că X-Forwarded-Proto este adăugat la dvs Varia antet. Acesta va preveni blocarea în bucla de redirecționare.

drapel tf
În primul rând, vă mulțumesc pentru răspunsul dumneavoastră detaliat. Am încercat să urmez pașii descriși în „Testarea ipotezei” și am făcut un jurnal al acelui test folosind varnishlog (am încărcat jurnalul https://pastebin.com/hxtp8gX9). Mă conectez continuu prin varnishlog așa cum ați descris și voi posta un jurnal cu când a apărut problema. >SetEnvIf X-Forwarded-Proto "https" HTTPS=on Adăugarea antetului Variază: X-Forwarded-Proto Se află în „configurația mea suplimentară apache”, care, în esență, este aproximativ aceeași cu adăugarea acesteia în fișierul .htaccess.
Thijs Feryn avatar
drapel in
@RemcovanGrinsven Ține-mă la curent, Remco. Aștept cu nerăbdare niște înregistrări decente când lucrurile merg prost.
drapel tf
Vă mulțumim pentru interesul dumneavoastră.Am reușit să surprind un moment de nefuncționare într-un vernishlog, versiunea scurtă a jurnalului poate fi găsită aici: https://pastebin.com/QzPh1r5R Am încărcat jurnalul complet https://we.tl/t-wDfhPo57in (Dacă preferați un alt site, îl vom încărca acolo) dar asta înseamnă multă înregistrare. Aștept cu nerăbdare să vă aud părerea.
Thijs Feryn avatar
drapel in
@RemcovanGrinsven Cred că l-am găsit. Mi-am actualizat răspunsul și am adăugat concluzia. Uită-te.
drapel tf
mulțumesc foarte mult pentru contribuție. Pe baza contribuției dvs., am putut găsi ceva suspect. În prezent testăm o posibilă soluție (am actualizat postarea noastră inițială pentru mai multe detalii).
drapel tf
Problema nu a apărut pe parcursul întregului weekend, fie este o coincidență uriașă, fie se poate concluziona că problema este rezolvată acum. Voi accepta contribuția dvs. ca soluție pentru alții care ar putea avea ceva asemănător. Contribuția dvs. a fost foarte perspicace!

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.