Varnish był zainstalowany i skonfigurowany, ale każde żądanie trafiało do PHP – hit rate wynosił 0%. Serwer był przeciążony mimo Varnisha. Problem w błędnej konfiguracji VCL i cookiach sesji. Czas naprawy: 4 godziny.
Objawy
- Varnish działa (port 6081), nginx słucha na 8080
varnishstatpokazuje MAIN.cache_hit = 0- Nagłówek odpowiedzi:
X-Cache: MISSna każdym żądaniu - Serwer PHP przeciążony mimo Varnisha
Diagnoza
# Sprawdź hit rate varnishstat -1 -f MAIN.cache_hit,MAIN.cache_miss # Sprawdź dlaczego request nie jest cache'owany varnishlog -g request -q "RespStatus == 200" | grep -E "VCL_call|X-Cache|Set-Cookie" # Sprawdź nagłówki odpowiedzi curl -I https://sklep.pl/ # Szukaj: X-Cache, Age, Via # Sprawdź czy Magento wysyła poprawne nagłówki cache curl -sI https://sklep.pl/ | grep -E "Cache-Control|X-Magento-Cache"
Przyczyna
Magento wysyłało cookie PHPSESSID na stronach które powinny być cache’owane. Varnish domyślnie nie cache’uje requestów z cookies. Dodatkowo VCL nie miał reguły do ignorowania cookie sesji PHP na stronach statycznych.
Rozwiązanie
# 1. Wygeneruj poprawny VCL z Magento bin/magento varnish:vcl:generate --export-version=6 --output-file=/etc/varnish/default.vcl # 2. Przeładuj Varnish z nowym VCL varnishadm vcl.load m2 /etc/varnish/default.vcl varnishadm vcl.use m2 # 3. Kluczowa część VCL - strip cookies na GET # W wygenerowanym VCL sprawdź sekcję vcl_recv:
sub vcl_recv {
# Remove cookies for static assets
if (req.url ~ "\.(jpg|jpeg|png|gif|css|js|ico|woff)$") {
unset req.http.Cookie;
return (hash);
}
# Remove non-essential cookies - keep only Magento session
if (req.http.Cookie) {
set req.http.Cookie = regsuball(req.http.Cookie,
"PHPSESSID=[^;]+;?\s*", "");
if (req.http.Cookie == "") {
unset req.http.Cookie;
}
}
}
Wynik
Hit rate po naprawie: 94%. Obciążenie PHP-FPM: spadek z 80% do 8%. TTFB na stronie głównej: z 2.1s do 0.04s.
