Indholdsfortegnelse:
- En introduktion til lak
- Det grundlæggende: cache-billeder
- Standarden: Cache-billeder og sider
- Standarden ++: Øg serverens robusthed
- Avanceret brug: Opret en elastisk webserver i et distribueret miljø
- Et kraftfuldt værktøj
Når det kommer til webstedets ydeevne, er Varnish en varm teknologi. Med en enkel installation og konfiguration er det muligt at øge ydelsen på ethvert websted og tjene op til en million sider med kun en lille virtuel privat server., Jeg viser dig fire mulige konfigurationer, der hjælper dig med at forbedre responstiden på dit websted, uanset om du betjener hundreder, tusinder eller millioner af sider.
En introduktion til lak
Varnish-Cache er en webaccelerator med det mål at cache webstedets indhold. Det er et open source-projekt, der sigter mod at optimere og fremskynde adgangen til websteder ikke-invasivt - uden at ændre koden - og giver dig mulighed for at sætte dine hænder på dit websted.
Det var skaberne af Varnish Cache, der kaldte det en webaccelerator, fordi dens primære mål er at forbedre og fremskynde et websteds frontend. Lakker opnår dette ved at gemme kopier af siderne, der serveres af webserveren, i dens cache. Næste gang der anmodes om den samme side, vil Varnish tjene kopien i stedet for at anmode om siden fra webserveren, hvilket resulterer i en enorm ydeevne i ydeevnen.
En anden af nøglefunktionerne i Varnish Cache ud over dens ydeevne er fleksibiliteten i dets konfigurationssprog, VCL. VCL gør det muligt at skrive politikker om, hvordan indgående anmodninger skal håndteres. I en sådan politik kan du beslutte, hvilket indhold du vil servere, hvorfra du vil hente indholdet, og hvordan anmodningen eller svaret skal ændres.
I de følgende eksempler på konfiguration viser jeg dig, hvilke VCL-regler, du skal bruge til at nå nogle mål, fra en enkel cache af billeder og statiske objekter, til at bruge lak i et distribueret miljø eller få det til at fungere som en belastningsafbalancering.
Alle følgende eksempler er til Varnish 3.x. Bemærk, at Varnish 2.x bruger forskellige syntaks og regler, så disse eksempler er ikke kompatible med den version.
Følgende er de vigtigste tilstande i Varnish, som vi vil bruge i VCL-konfigurationsfilen:
recv
Dette er den første funktion, der kaldes, når du modtager en anmodning. Her kan vi manipulere anmodningen, inden vi tjekker, om den findes i cachen. Hvis en anmodning ikke kan sættes i en cache, kan den back-end-server, som anmodningen sendes til, også vælges i denne fase.
passere
Vi kan bruge denne funktion, når vi vil videresende anmodningen til webserveren og cache svaret.
rør
Denne funktion omgår Lakker og sender anmodningen til webserveren.
kig op
Med et opslag beder Varnish om at kontrollere, om svaret er til stede og gyldigt i cachen.
hente
Denne funktion kaldes, når gendannelse af indhold fra bagenden er påberåbt af et pas eller en miss.
Det grundlæggende: cache-billeder
Så lad os se på et eksempel på konfiguration. I dette første eksempel cacheer vi bare billederne og de statiske filer som CSS-filer. Denne konfiguration er virkelig nyttig, når du ikke kender det websted, du vil opbygge, så du kan bare beslutte, at alle billeder, CSS og JavaScript er de samme for alle brugere. For at skelne brugere bruger HTTP-protokollen cookies, så vi er nødt til at fjerne dem i denne type anmodning, så de er de samme for Varnish:
sub vcl_recv{
if(req.url ~ " * \.(png|gif|jpg|swf|css|js)"{
unset req.http.cookie;
unset req.http.Vary;
return(lookup);
}
# strip the cookie before the image is inserted into cache.
sub vcl_fetch {
if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
unset beresp.http.set-cookie;
}
Og det er det. Med denne VCL-fil kan du nemt cache statisk indhold.
Standarden: Cache-billeder og sider
Normalt vil du ikke bare cache det statiske indhold på dit websted, men du vil også cache nogle dynamiske sider, der er genereret af din webserver, men det er det samme for alle brugere - eller i det mindste for alle dine anonyme brugere. I denne fase skal du vide, hvilke sider der kan cacher, og hvilke der ikke kan.
Et godt eksempel er Wordpress, et af de mest almindeligt anvendte content management systemer. Wordpress genererer hjemmesider dynamisk med PHP og forespørgsler til en MySQL-database. Dette er rart, fordi du nemt kan opdatere dit websted fra administrationsgrænsefladen med få klik, men det er også dyrt med hensyn til anvendte ressourcer. Hvorfor køre det samme PHP-script og MySQL-forespørgsel, hver gang en bruger lander på startsiden? Vi kan bruge Varnish til at cache de mest besøgte sider og opnå utrolige resultater.
Dette er nogle regler, der kan være nyttige i en Wordpress-installation:
sub vcl_recv{
# Let's make sure we aren't compressing already compressed formats.
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|mp3|mp4|m4v)(\?. * |)$") {
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 {
remove req.http.Accept-Encoding;
}
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
# Unset all cookies if not Wordpress admin - otherwise login will fail
if (!(req.url ~ "wp-(login| admin )")) {
unset req.http.cookie;
return(lookup);
}
# If you request the special pages go directly to them
if (req.url ~ "wp-(login| admin )") {
return (pipe);
}
}
sub vcl_miss {
if (!(req.url ~ "wp-(login| admin )")) {
unset req.http.cookie;
}
if (req.url ~ "^/+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") {
unset req.http.cookie;
set req.url = regsub(req.url, "\?.$", "");
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
}
sub vcl_fetch {
if (req.url ~ "^/$") {
unset beresp.http.set-cookie;
}
# Unset all cookies if not Wordpress admin - otherwise login will fail
if (!(req.url ~ "wp-(login| admin )")) {
unset beresp.http.set-cookie;
}
}
Du kan se, at vi i dette eksempel cacheer alle siderne fra vores websted, men for dem, der har "wp-admin" eller "wp-login" i url, er strengene "specielle" placeringer, der bruges til at logge ind på Wordpress som administrator. Som sådan ønsker vi at tale direkte med webserveren og omgå Lakker-cachen.
Naturligvis, hvis du bruger Drupal, Joomla eller et skræddersyet websted, skal du ændre disse regler, men målet er altid det samme: At sende alle de dynamiske sider og cache, du kan, til din bagside.
Standarden ++: Øg serverens robusthed
Engang bliver webservere langsomme, fordi de har en stor belastning. Lakker kan også hjælpe med dette. Vi kan bruge nogle særlige direktiver til at fortælle Varnish om at undgå at tale med bagenden, hvis den er nede eller svarer for langsomt. I disse tilfælde bruger Varnish "nåde" -direktivet.
Nåde inden for rammerne af Lakkering betyder levering af ellers udløbne genstande, når omstændighederne kræver det. Dette kan ske, fordi:
- Den valgte back-end-direktør er nede
- En anden tråd har allerede sendt en anmodning til bagenden, som endnu ikke er færdig.
sub vcl_recv {
if (req.backend.healthy) {
set req.grace = 30s;
} else {
set req.grace = 1h;
}
}
sub vcl_fetch {
set beresp.grace = 1h;
}
Denne konfiguration beder Varnish om at teste bagenden og hæve nådeperioden, hvis den har nogle problemer. Eksemplet ovenfor introducerer også direktivet "req.backend.healthy", der bruges til at kontrollere en bagenden. Dette er virkelig nyttigt, når du har flere bagenden, så lad os se på et mere avanceret eksempel.
Avanceret brug: Opret en elastisk webserver i et distribueret miljø
Dette er vores endelige konfigurationsfil med alle de muligheder, vi har set indtil videre, og definitionen af to bagenden med et specielt direktiv for sonden. Sådan bestemmer Varnish, om en webserver er i live eller ikke.
.url
Lakker vil anmode om bagenden med denne URL.
.tiden er gået
Bestemmer, hvor hurtigt sonden skal være færdig. Du skal angive en tidsenhed med et tal, såsom "0, 1 s", "1230 ms" eller endda "1 h".
.interval
Hvor længe man skal vente mellem afstemninger. Du skal også specificere en tidsenhed her. Bemærk, at dette ikke er en "rate", men et "interval". Den laveste afstemning er (. Timeout +. Interval).
.vindue
Hvor mange af de seneste meningsmålinger, der skal tages i betragtning, når man afgør, om bagenden er sund.
.Grænseværdi
Hvor mange af vinduerne sidste afstemninger skal være gode for, at bagenden kan erklæres sunde.
Nu kan vi bruge direktivet "req.backend.healthy" og få et boolskt resultat, der fortæller os, om bagenden er i live eller ikke.
#
# Customized VCL file for serving up a Wordpress site with multiple back-ends.
#
# Define the internal network subnet.
# These are used below to allow internal access to certain files while not
# allowing access from the public internet .
acl internal {
"10.100.0.0"/24;
}
# Define the list of our backends (web servers), they Listen on port 8080
backend web1 { .host = "10.100.0.1"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}
backend web2 { .host = "10.100.0.2"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}
# Define the director that determines how to distribute incoming requests.
director default_director round-robin {
{ .backend = web1; }
{ .backend = web2; }
}
# Respond to incoming requests.
sub vcl_recv {
set req.backend = default_director;
# Use anonymous, cached pages if all backends are down.
if (!req.backend.healthy) {
unset req.http.Cookie;
set req.grace = 6h;
} else {
set req.grace = 30s;
}
# Unset all cookies if not Wordpress admin - otherwise login will fail
if (!(req.url ~ "wp-(login| admin )")) {
unset req.http.cookie;
return(lookup);
}
# If you request the special pages go directly to them
if (req.url ~ "wp-(login| admin )") {
return (pipe);
}
# Always cache the following file types for all users.
if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {
unset req.http.Cookie;
}
}
# Code determining what to do when serving items from the web servers.
sub vcl_fetch {
# Don't allow static files to set cookies.
if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {
# beresp == Back-end response from the web server.
unset beresp.http.set-cookie;
}
# Allow items to be stale if needed.
set beresp.grace = 6h;
}
Et kraftfuldt værktøj
Dette er blot nogle eksempler, der kan hjælpe dig med at komme i gang med at bruge Varnish. Dette værktøj er virkelig kraftfuldt og kan hjælpe dig med at opnå et stort ydeevne uden at købe mere hardware eller virtuelle maskiner. For mange webstedsadministratorer er det en reel fordel.