Innholdsfortegnelse:
- En introduksjon til lakk
- Grunnleggende: Cache-bilder
- Standarden: Cache-bilder og sider
- Standard ++: Øk servermotstanden
- Avansert bruk: Lag en spenstig webserver i et distribuert miljø
- Et kraftig verktøy
Når det gjelder ytelse på nettstedet, er Varnish en varm teknologi. Med en enkel installasjon og konfigurasjon er det mulig å øke ytelsen til ethvert nettsted og tjene opptil en million sider med bare en liten virtuell, privat server., Jeg viser deg fire mulige konfigurasjoner som vil hjelpe deg med å forbedre responstiden på nettstedet ditt, enten du tjener hundrevis, tusenvis eller millioner sider.
En introduksjon til lakk
Varnish-Cache er en nettakselerator som har som mål å buffer nettstedinnhold. Det er et åpen kildekode-prosjekt som tar sikte på å optimalisere og øke hastigheten på tilgangen til nettsteder ikke-invasivt - uten å endre koden - og lar deg legge hendene inn på nettstedet ditt.
Det var skaperne av Varnish Cache som kalte det en nettakselerator, fordi det primære målet er å forbedre og øke hastigheten på et nettsted. Lakk oppnår dette ved å lagre kopier av sidene som serveres av webserveren i cachen. Neste gang samme side blir bedt om, vil Varnish tjene kopien i stedet for å be om siden fra webserveren, noe som resulterer i en enorm ytelsesøkning.
En annen av nøkkelfunksjonene i Varnish Cache, i tillegg til ytelsen, er fleksibiliteten i konfigurasjonsspråket, VCL. VCL gjør det mulig å skrive retningslinjer for hvordan innkommende forespørsler skal håndteres. I en slik policy kan du bestemme hvilket innhold du vil servere, hvor du vil hente innholdet og hvordan forespørselen eller svaret skal endres.
I de følgende eksemplene på konfigurasjon, vil jeg vise deg hvilke VCL-regler du skal bruke for å oppnå noen mål, fra enkel bufring av bilder og statiske objekter, til å bruke lakk i et distribuert miljø eller å la det fungere som en belastningsbalanse.
Alle følgende eksempler er for Varnish 3.x. Vær oppmerksom på at Varnish 2.x bruker forskjellige syntaks og regler, så disse eksemplene er ikke kompatible med den versjonen.
Følgende er hovedstatene i Varnish, som vi vil bruke i VCL-konfigurasjonsfilen:
recv
Dette er den første funksjonen som kalles når du mottar en forespørsel. Her kan vi manipulere forespørselen før vi skal sjekke om den er til stede i cachen. Hvis en forespørsel ikke kan settes i en cache, kan også back-end-serveren som forespørselen sendes til, velges i denne fasen.
sende
Vi kan bruke denne funksjonen når vi vil sende forespørselen til webserveren og cache svaret.
rør
Denne funksjonen omgår Vernish og sender forespørselen til webserveren.
se opp
Med et oppslag ber Varnish om å bekrefte om svaret er til stede og gyldig i cachen.
hente
Denne funksjonen kalles etter at gjenoppretting av innhold fra bakenden er påkalt av et pass eller en glipp.
Grunnleggende: Cache-bilder
Så la oss se på et eksempel på konfigurasjon. I dette første eksemplet buffer vi bare bildene og de statiske filene som CSS-filer. Denne konfigurasjonen er veldig nyttig når du ikke kjenner nettstedet du vil øke, slik at du bare kan bestemme at alle bilder, CSS og JavaScript er de samme for alle brukere. For å skille brukere bruker HTTP-protokollen informasjonskapsler, så vi må eliminere dem i denne typen forespørsler, slik at de er like 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-filen kan du enkelt cache statisk innhold.
Standarden: Cache-bilder og sider
Vanligvis vil du ikke bare cache det statiske innholdet på nettstedet ditt, men du vil også cache noen dynamiske sider som er generert av webserveren, men det er det samme for alle brukerne - eller i det minste for alle dine anonyme brukere. I denne fasen må du vite hvilke sider som kan bufres og hvilke som ikke kan.
Et godt eksempel er Wordpress, et av de mest brukte innholdsstyringssystemene. Wordpress genererer nettsider dynamisk med PHP og spørringer til en MySQL-database. Dette er fint fordi du enkelt kan oppdatere nettstedet ditt fra administrasjonsgrensesnittet med få klikk, men det er også dyrt når det gjelder ressurser som brukes. Hvorfor kjøre det samme PHP-skriptet og MySQL-spørringen hver gang en bruker lander på hjemmesiden? Vi kan bruke Varnish til å cache de mest besøkte sidene og oppnå utrolige resultater.
Dette er noen regler som kan være nyttige i en Wordpress-installasjon:
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 i dette eksempelet hurtigbuffer vi alle sidene fra nettstedet vårt, men for de som har "wp-admin" eller "wp-login" i url-en er strengene "spesielle" steder som brukes til å logge inn på Wordpress som administrator. Som sådan ønsker vi å snakke direkte med webserveren og omgå Lakk-cachen.
Naturligvis, hvis du bruker Drupal, Joomla eller et skreddersydd nettsted, må du endre disse reglene, men målet er alltid det samme: Å sende alle dynamiske sider og hurtigbuffer du kan på baksiden.
Standard ++: Øk servermotstanden
Noen ganger blir webservere sakte fordi de har stor belastning. Lakk kan hjelpe med dette også. Vi kan bruke noen spesielle direktiver for å fortelle Varnish om å unngå å snakke med bakenden hvis den er nede eller svarer for sakte. For disse tilfellene bruker Varnish "nåde" -direktivet.
Nåd i omfanget av lakk betyr å levere ellers utgåtte objekter når omstendighetene krever det. Dette kan skje fordi:
- Den valgte back-end-direktøren er nede
- En annen tråd har allerede sendt en forespørsel til bakenden som ennå ikke er ferdig.
sub vcl_recv {
if (req.backend.healthy) {
set req.grace = 30s;
} else {
set req.grace = 1h;
}
}
sub vcl_fetch {
set beresp.grace = 1h;
}
Denne konfigurasjonen forteller at Varnish skal teste bakenden og heve nådeperioden hvis den har noen problemer. Eksemplet ovenfor introduserer også direktivet "req.backend.healthy", som brukes til å sjekke en bakside. Dette er veldig nyttig når du har flere bakenden, så la oss ta en titt på et mer avansert eksempel.
Avansert bruk: Lag en spenstig webserver i et distribuert miljø
Dette er den endelige konfigurasjonsfilen vår med alle alternativene vi har sett så langt, og definisjonen av to bakenden med noen spesielle direktiv for sonden. Slik bestemmer Varnish for om en webserver er i live eller ikke.
uRL-
Lakk vil komme med forespørsler på baksiden med denne nettadressen.
.pause
Bestemmer hvor raskt sonden må fullføre. Du må spesifisere en tidsenhet med et tall, for eksempel "0, 1 s", "1230 ms" eller til og med "1 h".
.interval
Hvor lang tid å vente mellom meningsmålingene. Du må spesifisere en tidsenhet også her. Legg merke til at dette ikke er en "rate", men et "intervall". Den laveste avstemningen er (. Timeout +. Intervall).
.vindu
Hvor mange av de siste meningsmålingene du må vurdere når du avgjør om bakenden er sunn.
.terskel
Hvor mange av de siste meningsmålingene i vinduet må være bra for at bakenden skal bli erklært sunn.
Nå kan vi bruke direktivet "req.backend.healthy" og få et boolskt resultat som forteller oss om bakenden (e) 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 kraftig verktøy
Dette er bare noen eksempler som kan hjelpe deg med å komme i gang med bruk av lakk. Dette verktøyet er veldig kraftig og kan hjelpe deg med å oppnå et flott ytelsesøkning uten å kjøpe mer maskinvare eller virtuelle maskiner. For mange administratorer av nettstedet er det en virkelig fordel.