Bekijk Volledige Versie : Varnish cache static content
We hebben Varnish nu al een tijdje voor Apache draaien, maar ik zie m.i. toch teveel requests in de Apache logfiles naar js, css enzovoorts bestanden. Deze horen 20 minuten ge-cached te worden door Varnish en toch worden ze vaak aan Apache opgevraagd. Nu heb ik het vermoeden dat dit te maken heeft met de browser instellingen van de bezoeker, te vergelijken met CTRL + F5 (hard refresh). Dit heeft dan weer te maken met de req.http.Cache-Control in Varnish volgens mij, maar is het verstandig deze te allen tijde te negeren? Hoe gaan jullie hiermee om?
Zijn het niet "gewoon" SSL requests die om Varnish heen gaan?
Deze staat o.a. wel in je VCL?
sub vcl_recv {
if (req.url ~ "\.(html|gif|jpg|jpeg|png|js|css)$") {
unset req.http.cookie;
return(lookup);
}
Zijn het niet "gewoon" SSL requests die om Varnish heen gaan?
Deze staat o.a. wel in je VCL?
sub vcl_recv {
if (req.url ~ "\.(html|gif|jpg|jpeg|png|js|css)$") {
unset req.http.cookie;
return(lookup);
}
1. Nee, geen SSL
2. Ja, in zowel vcl_recv als vcl_fetch worden de cookies "verwijderd"
cyberbootje
27/08/13, 23:31
Kijk anders even naar varnishstat of je wel een goeie hitrate hebt om te beginnen.
Als dat al bagger is dan is er meer mis...
Kijk anders even naar varnishstat of je wel een goeie hitrate hebt om te beginnen.
Als dat al bagger is dan is er meer mis...
Volgens Varnish zijn er toch aardig wat HITS geweest. De MISSES zijn voornamelijk van een website die we excluded hebben van Varnish.
Handel je ook de user-agent en bijhorende accept-encoding af ? Als je dat niet doet, dan is elke user-agent en encoding een apart object.
Indien je daar geen rekening mee houd, raad ik je aan user-agent te strippen, en de encoding in 3 of 4 soorten op te splitsen, daarmee verhoog je direct je hitrate, en verlaag je de back-end calls. Je hebt per item een maximum van 3 / of 4 calls, afhankelijk wat de lifetime van je cache is uiteraard !
Handel je ook de user-agent en bijhorende accept-encoding af ? Als je dat niet doet, dan is elke user-agent en encoding een apart object.
Indien je daar geen rekening mee houd, raad ik je aan user-agent te strippen, en de encoding in 3 of 4 soorten op te splitsen, daarmee verhoog je direct je hitrate, en verlaag je de back-end calls. Je hebt per item een maximum van 3 / of 4 calls, afhankelijk wat de lifetime van je cache is uiteraard !
Mikey heb je daar een voorbeeld van?
Aan vcl_recv heb ik toegevoegd:
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|ico |woff|ttf|eot|svg)$") {
# No point in compressing these
remove req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
# unkown algorithm
remove req.http.Accept-Encoding;
}
}
Aan vcl_fetch heb ik toegevoegd:
if (beresp.http.Vary ~ "User-Agent") {
set beresp.http.Vary = regsub(req.http.Vary, ",? *User-Agent *", "");
set beresp.http.Vary = regsub(req.http.Vary, "^, *", "");
if (beresp.http.Vary == "") {
remove beresp.http.Vary;
}
}
Dit lijkt wel te werken maar nog niet direct mijn hitrate te verhogen.
Ramon Fincken
26/03/14, 09:15
Vergeet de cookies niet (en GET requests met ? en & )
Ramon Fincken
26/03/14, 09:47
Handel je ook de user-agent en bijhorende accept-encoding af ? Als je dat niet doet, dan is elke user-agent en encoding een apart object.
Indien je daar geen rekening mee houd, raad ik je aan user-agent te strippen, en de encoding in 3 of 4 soorten op te splitsen, daarmee verhoog je direct je hitrate, en verlaag je de back-end calls. Je hebt per item een maximum van 3 / of 4 calls, afhankelijk wat de lifetime van je cache is uiteraard !
Hi Mike,
heb je hier documentatie van? Ik kan het nergens vinden dat dat by default (VCL 3.x) apart gaat.
kon wel wat vinden om het juist apart te maken: https://www.varnish-cache.org/docs/3.0/tutorial/devicedetection.html
Mikey heb je daar een voorbeeld van?
Aan vcl_recv heb ik toegevoegd:
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|ico |woff|ttf|eot|svg)$") {
# No point in compressing these
remove req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
# unkown algorithm
remove req.http.Accept-Encoding;
}
}
Aan vcl_fetch heb ik toegevoegd:
if (beresp.http.Vary ~ "User-Agent") {
set beresp.http.Vary = regsub(req.http.Vary, ",? *User-Agent *", "");
set beresp.http.Vary = regsub(req.http.Vary, "^, *", "");
if (beresp.http.Vary == "") {
remove beresp.http.Vary;
}
}
Dit lijkt wel te werken maar nog niet direct mijn hitrate te verhogen.
Hiermee moet je heel eind komen, comment deze line in je apache config ook eens:
Header append Vary User-Agent env=!dont-vary
Hi Mike,
heb je hier documentatie van? Ik kan het nergens vinden dat dat by default (VCL 3.x) apart gaat.
kon wel wat vinden om het juist apart te maken: https://www.varnish-cache.org/docs/3.0/tutorial/devicedetection.html
Geen idee of er documentatie van is, je kan de behavior ervan zien als je varnish monitored en daar de user agents en encoding eruit gaat halen. Dan moet je niet schrikken als er duizenden verschillende zijn, en deze dus ook allemaal eigen cache objects hebben. Met een beetje pech heb je een cache object die maar door een paar bezoekers gebruikt wordt, dat terwijl het idee dat een image of andere output juist door heel veel gebruikt wordt en eventueel in een paar verschillende objects geplaatst wordt. Als je dit in lijnen zet is de request naar de backend per file /url maar een handvol keer ipv per useragent en encoding.
succes :)!
Ramon Fincken
26/03/14, 10:48
Net idd even een user agent testje gedaan en oeps :)
Goeie tip!
Net idd even een user agent testje gedaan en oeps :)
Goeie tip!
En nu dus zorgen dat alles in grote lijnen in groepen bij elkaar komt. En daar zijn verschillende wegen naar rome voor :) Als je dat doet, heb je qua basis al een kick-ass hitrate !
Ramon Fincken
26/03/14, 10:54
En nu dus zorgen dat alles in grote lijnen in groepen bij elkaar komt. En daar zijn verschillende wegen naar rome voor :) Als je dat doet, heb je qua basis al een kick-ass hitrate !
We hebben meerdere varnish VM's draaien met verschillende truckjes, maar deze gaat er zeker bij komen. Helaas kan het niet altijd ivm " mobiele thema's ", maar voor de hosted sites kan het prima :)
En aangezien ik geen zin heb in een nieuw topic ervoor te maken. Voor wie met php 5.5.9 werkt met esi tags en sessions. Er is een bug in php dat zorgt ervoor voor een dubbele session file waarbij er maar een opgeruimd wordt. Bij sites met veel unieke bezoekers per maand zorgt dit uiteindelijk ervoor dat je garbage collector gek wordt.
We hebben meerdere varnish VM's draaien met verschillende truckjes, maar deze gaat er zeker bij komen. Helaas kan het niet altijd ivm " mobiele thema's ", maar voor de hosted sites kan het prima :)
Voor mobiele thema's kan ik niets anders aanraden dan twitter bootstrap. Zeker met de huidige generatie smartphones en tablets is het onnodig aparte thema's te maken. Scheelt weer zoveel % erbovenop :)
Vergeet de cookies niet (en GET requests met ? en & )
Daar voor heb ik:
## Remove has_js and Google Analytics cookies.
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|has_js)=[^;]*", "");
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
if (req.http.Cookie ~ "^\s*$") {
unset req.http.Cookie;
}
# Cache things with these extensions
if (req.url ~ "\.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg| swf|pdf|woff|ttf|eot|svg)$" && ! (req.url ~ "\.(php)") ) {
unset req.http.Cookie;
return (lookup);
}
en
## get rid of unnecessary versioning
set req.url = regsub(req.url, "\.js\?.*", ".js");
set req.url = regsub(req.url, "\.css\?.*", ".css");
set req.url = regsub(req.url, "\.jpg\?.*", ".jpg");
set req.url = regsub(req.url, "\.png\?.*", ".png");
set req.url = regsub(req.url, "\.gif\?.*", ".gif");
set req.url = regsub(req.url, "\.swf\?.*", ".swf");
set req.url = regsub(req.url, "\.xml\?.*", ".xml");
set req.url = regsub(req.url, "\.woff\?.*", ".woff");
set req.url = regsub(req.url, "\.ttf\?.*", ".ttf");
set req.url = regsub(req.url, "\.eot\?.*", ".eot");
set req.url = regsub(req.url, "\.svg\?.*", ".svg");
Dat zou volgens mij voldoende moeten zijn... toch zie ik dat bijvoorbeeld plaatjes verdomd vaak aan de backend worden opgevraagd.
Hoe lang is je ttl op je objects, en hoe groot is je cache size ? Als hij te klein is, wordt er gewisseld voordat de ttl voorbij is.
Ramon Fincken
26/03/14, 11:20
Voor mobiele thema's kan ik niets anders aanraden dan twitter bootstrap. Zeker met de huidige generatie smartphones en tablets is het onnodig aparte thema's te maken. Scheelt weer zoveel % erbovenop :)
Waar ik op doel zijn 2 themas (of meer) : 1 desktop en 1 mobiel. Er gaat dus steeds wat anders over de lijn afhankelijk van je user agent etc..
Als je een fatsoenlijk responsive theme hebt is de kans > 99% dat alles wat je over de lijn gooit hetzelfde is (qua HTML).
Hoe lang is je ttl op je objects, en hoe groot is je cache size ? Als hij te klein is, wordt er gewisseld voordat de ttl voorbij is.
Statische bestanden worden voor 20 minuten gecached (in memory / malloc,1G).
Maar ik zie om de paar seconden bijvoorbeeld een jpeg opgevraagd worden aan Apache wat m.i. niet de bedoeling kan zijn, overigens zijn er dan wel +- 2000 bezoekers online/bezig.