Huis Software Vernis: bereid je voor op een slashdotted!

Vernis: bereid je voor op een slashdotted!

Inhoudsopgave:

Anonim

Als het gaat om websiteprestaties, is Varnish een geavanceerde technologie. Met een eenvoudige installatie en configuratie is het mogelijk om de prestaties van elke website te verbeteren en tot een miljoen pagina's te presenteren met slechts een kleine virtuele privéserver., Laat ik u vier mogelijke configuraties zien die u helpen de responstijd van uw site te verbeteren, of u nu honderden, duizenden of miljoenen pagina's weergeeft.

Een inleiding tot vernis

Varnish-Cache is een webversneller met als doel website-inhoud te cachen. Het is een open-sourceproject dat niet-invasief de toegang tot websites wil optimaliseren en versnellen - zonder de code te wijzigen - en waarmee u uw website in handen kunt krijgen.


Het waren de makers van Varnish Cache die het een webversneller noemden, omdat het primaire doel is om de front-end van een website te verbeteren en te versnellen. Varnish bereikt dit door kopieën van de pagina's opgeslagen door de webserver in zijn cache op te slaan. De volgende keer dat dezelfde pagina wordt aangevraagd, zal Varnish de kopie weergeven in plaats van de pagina op te vragen bij de webserver, wat resulteert in een geweldige prestatieverbetering.


Een andere van de belangrijkste kenmerken van Varnish Cache, naast zijn prestaties, is de flexibiliteit van de configuratietaal, VCL. VCL maakt het mogelijk om beleid te schrijven over hoe inkomende aanvragen moeten worden behandeld. In een dergelijk beleid kunt u beslissen welke inhoud u wilt weergeven, van waar u de inhoud wilt ophalen en hoe het verzoek of antwoord moet worden gewijzigd.


In de volgende configuratievoorbeelden laat ik u zien welke VCL-regels u moet gebruiken om enkele doelen te bereiken, van het eenvoudig in de cache opslaan van afbeeldingen en statische objecten tot het gebruik van Varnish in een gedistribueerde omgeving of het laten werken als een taakverdeler.


Alle volgende voorbeelden zijn voor Varnish 3.x. Houd er rekening mee dat Varnish 2.x verschillende syntaxis en regels gebruikt, dus deze voorbeelden zijn niet compatibel met die versie.


Dit zijn de belangrijkste staten van Varnish, die we zullen gebruiken in het VCL-configuratiebestand:


recv

Dit is de eerste functie die wordt opgeroepen bij het ontvangen van een verzoek. Hier kunnen we het verzoek manipuleren voordat we gaan controleren of het in de cache aanwezig is. Als een aanvraag niet in een cache kan worden geplaatst, kan in deze fase ook de back-end-server worden gekozen waarnaar de aanvraag wordt verzonden.


voorbij gaan aan

We kunnen deze functie gebruiken wanneer we het verzoek aan de webserver willen doorgeven en het antwoord in de cache willen opslaan.


pijp

Deze functie omzeilt Varnish en verzendt het verzoek naar de webserver.


opzoeken

Met een zoekopdracht vraagt ​​Varnish om te verifiëren of het antwoord aanwezig en geldig is in de cache.


halen

Deze functie wordt genoemd nadat het herstel van inhoud van de back-end is geactiveerd door een pass of een misser.

De basis: afbeeldingen in de cache

Laten we dus eens kijken naar een voorbeeld van configuratie. In dit eerste voorbeeld slaan we alleen de afbeeldingen en de statische bestanden op, zoals CSS-bestanden. Deze configuratie is erg handig als u niet weet welke website u wilt verbeteren, dus u kunt gewoon beslissen dat alle afbeeldingen, CSS en JavaScript voor alle gebruikers hetzelfde zijn. Om gebruikers te onderscheiden, maakt het HTTP-protocol gebruik van cookies, dus moeten we ze in dit soort verzoeken verwijderen zodat ze allemaal hetzelfde zijn voor 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;

}

En dat is het. Met dit VCL-bestand kunt u gemakkelijk statische inhoud in de cache opslaan.

De standaard: afbeeldingen en pagina's in de cache opslaan

Gewoonlijk wilt u niet alleen de statische inhoud van uw website opslaan in de cache, maar wilt u ook enkele dynamische pagina's opslaan die door uw webserver worden gegenereerd, maar die voor alle gebruikers hetzelfde zijn - of althans voor al uw anonieme gebruikers. In deze fase moet u weten welke pagina's in de cache kunnen worden geplaatst en welke niet.


Een goed voorbeeld is Wordpress, een van de meest gebruikte contentmanagementsystemen. Wordpress genereert dynamisch webpagina's met PHP en zoekopdrachten naar een MySQL-database. Dit is leuk omdat u uw website gemakkelijk kunt bijwerken vanuit de beheerinterface met enkele klikken, maar het is ook duur in termen van gebruikte middelen. Waarom hetzelfde PHP-script en dezelfde MySQL-query uitvoeren telkens wanneer een gebruiker op de startpagina belandt? We kunnen Varnish gebruiken om de meest bezochte pagina's te cachen en ongelooflijke resultaten te bereiken.


Dit zijn enkele regels die handig kunnen zijn in een Wordpress-installatie:

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;

}

}

Je kunt zien dat we in dit voorbeeld alle pagina's van onze website in de cache opslaan, maar voor degenen met "wp-admin" of "wp-login" in de URL zijn de tekenreeksen "speciale" locaties die worden gebruikt om in te loggen Wordpress als beheerder. Als zodanig willen we rechtstreeks met de webserver praten en de verniscache omzeilen.


Als u Drupal, Joomla of een op maat gemaakte website gebruikt, moet u natuurlijk deze regels wijzigen, maar het doel is altijd hetzelfde: alle dynamische pagina's en cache naar uw back-end verzenden.

De standaard ++: verhoog de veerkracht van de server

Soms worden webservers traag omdat ze een hoge belasting hebben. Ook vernis kan hierbij helpen. We kunnen enkele speciale richtlijnen gebruiken om Varnish te vertellen om te voorkomen dat ze met de achterkant praten als deze niet werkt of te langzaam antwoordt. Voor deze gevallen gebruikt Varnish de "grace" -richtlijn.


Genade in het kader van Varnish betekent het leveren van anders verlopen objecten wanneer de omstandigheden dat vereisen. Dit kan gebeuren omdat:

  • De geselecteerde back-endregisseur is uitgeschakeld
  • Een andere thread heeft al een aanvraag gedaan aan de back-end die nog niet is voltooid.
Beide gevallen worden hetzelfde behandeld in VCL:

sub vcl_recv {

if (req.backend.healthy) {

set req.grace = 30s;

} else {

set req.grace = 1h;

}

}


sub vcl_fetch {

set beresp.grace = 1h;

}

Deze configuratie vertelt Varnish om de achterkant te testen en de respijtperiode te verlengen als er problemen zijn. Het bovenstaande voorbeeld introduceert ook de richtlijn "req.backend.healthy", die wordt gebruikt om een ​​back-end te controleren. Dit is echt handig als u meerdere back-ends hebt, dus laten we een meer geavanceerd voorbeeld bekijken.

Geavanceerd gebruik: maak een veerkrachtige webserver in een gedistribueerde omgeving

Dit is ons laatste configuratiebestand met alle opties die we tot nu toe hebben gezien en de definitie van twee back-ends met een speciale richtlijn voor de sonde. Dit is hoe Varnish bepaalt of een webserver leeft of niet.


.url

Varnish zal met deze URL verzoeken indienen bij de back-end.


.time-out

Bepaalt hoe snel de sonde moet eindigen. U moet een tijdseenheid opgeven met een nummer, zoals "0.1 s", "1230 ms" of zelfs "1 h".


.interval

Hoe lang wacht je tussen twee peilingen? U moet hier ook een tijdseenheid opgeven. Merk op dat dit geen "snelheid" is, maar een "interval". Het laagste peilingspercentage is (.timeout + .interval).


.venster

Hoeveel van de nieuwste peilingen om te overwegen bij het bepalen of de achterkant gezond is.


.drempel

Hoeveel van de laatste peilingen van het venster moeten goed zijn voor de achterkant om gezond te worden verklaard.


Nu kunnen we de richtlijn "req.backend.healthy" gebruiken en een Booleaans resultaat krijgen dat ons vertelt of de back-end (s) nog leven of niet.

#

# 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;

}

Een krachtig hulpmiddel

Dit zijn slechts enkele voorbeelden die u kunnen helpen om Varnish te gebruiken. Deze tool is echt krachtig en kan u helpen een geweldige prestatieverbetering te bereiken zonder meer hardware of virtuele machines te kopen. Voor veel websitebeheerders is dat een echt voordeel.

Vernis: bereid je voor op een slashdotted!