Inštalácia proxy servera Varnish na virtuálny server

 

Varnish je proxy server pre cachovanie výstupov webových aplikacií. Ponúka vysokú mieru konfigurovateľnosti a výrazne vyšší výkon a nižšiu spotrebu pamäte. Pri správnej konfigurácii umožňuje serveru zvládnuť mnohonásobne viac návštevníkov.

 

Varnish je nasadený pred webový server a požiadavky na porte 80. Poskytuje už predpripravené HTML požiadavky, čím minimalizuje počet požiadaviek na ktoré musí webserver vynaložiť pamäť a výkon CPU.

 

Jeho použitie si vyžaduje v prípade správy hostingov pomocou služby Server Manager dodatočnú konfiguráciu po pridaní hostingu. Vhodný je najmä pokiaľ na serveri beží iba jeden hosting.

 

Priamu podporu pre Varnish majú nasledovné systémy:

 

  • Wordpress
  • Multisite Wordpress
  • Magento
  • Mediawiki
  • Drupal
  • Joomla

 

Problémy s nasadením Varnish sme zaznamenali pri :

  • Moodle
  • Prestashop
  • SugarCRM
  • Koken

 

 

Inštalácia Varnish 


Overte, či je hostname servera nastavený v súlade s DNS

 

hostname

 

hostname ­f

 

nainštalujeme balíček pre Varnish a prípadne ďalšie balíčky, od ktorých je závislý

 

apt­get update

 

apt­get install varnish

 

takisto je vhodné inštalovať pre ručné volanie jeho funkcií utilitu curl

 

apt­get install curl

 

Konfigurácia Varnish


 

1. nastavíme Apache na port 8080 a Varnish na port 80

 

Štandardne Varnish počúva na porte 6081, zmeníme ho na 80

 

nano /etc/default/varnish

 

nájdeme blok

 

DAEMON_OPTS="­a :6081 \

 

T localhost:6082

 

f /etc/varnish/default.vcl \

 

S /etc/varnish/secret \

 

a nahradíme ho

 

DAEMON_OPTS="­a :80 \

 

T localhost:6082 \

 

f /etc/varnish/default.vcl \

 

S /etc/varnish/secret \

 

parameter ­si určuje úložisko pre dáta a jeho veľkosť. Pokiaľ máte server s nižšou RAM (512MB), odporúčame ho zmeniť na ­s file,

 

/var/lib/varnish/$INSTANCE/varnish_storage.bin,96M"

 

taktiež zmeníme parameter START = yes aby sa Varnish spustil aj po reštarte servera .

 

Pred jeho spustením je však potrebné taktiež nakonfigurovať aj webserver:

 

nano /etc/apache2/ports.conf

 

listen 80;

 

zmeníme na

 

listen 8080;

 

Taktiež je potrebné port zmeniť v konfiguračných súboroch Apache2 pre hosting(y), možete to spravit ľahko pre všetky konfiguračné súbory pomocou príkazu sed:

 

sed ­i 's/\:80/\:8080/' /etc/apache2/sites­enabled/*

 

Správanie Varnish je možné upraviť a ľadiť pomocou súboru /etc/varnish/default.vcl , nakoľko je každá aplikácia špecifická, neexistuje univerzálne nastavenie, ktoré funguje pre všetky.

 

Zakladným prvkom ovplyvňujúcim správanie Varnish sú HTTP hlavičky generované aplikáciou, webserverom alebo prehľiadačom návštevníka. Na webe je dostupných viacero návodov k jednotlivým aplikáciam.

 

Podelíme sa však o niekoľko základných trikov s ohľadom na často používané CMS:

 

backend default {

 

.host = "127.0.0.1";

 

.port = "8080";

 

.first_byte_timeout = 300s;

 

}

 

tu sa určuje štandardný backend, kam sú požiadavky smerované, teda v našom prípade Apache2

Ak by ste potrebovali pridať ďalší, je potrebné ho označiť vlastným návestím, napr.:

 

backend google {

 

.host = "209.85.229.106"; /*www.google.com";*/

 

.port = "80";

 

}

 

Pre ručné prečistenie záznamu v cache sa použije request typu PURGE na URL , ktorá sa má premazať. Ktoré IP adresy môžu tento request poslať určuje direktíva acl_purge

 

acl purge {

 

"firemnyserver.noip.org";

 

"wordpress.domena.tld";

 

"domena.tld";

 

"localhost";

 

}

 

Následné prečistenie danej URL je realizované v 

 

sub vlc_recv{ pridanim

 

if (req.request == "PURGE") {

 

if (!client.ip ~ purge) {

 

}

 

}

 

a v

 

sub vcl_hit {

 

if (req.request == "PURGE") {

 

}

 

}

 

sub vcl_miss {

 

if (req.request == "PURGE") {

 

}

 

}

 

Pre správne fungovanie gzip kompresie je do sub vcl_recv {

 

na jeho začiatok pridať

 

if (req.http.Accept­Encoding) {

 

if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {

 

# No point in compressing these

 

remove req.http.Accept­Encoding;

 

} else if (req.http.Accept­Encoding ~ "gzip") {

 

set req.http.Accept­Encoding = "gzip";

 

purge_url(req.url);

 

error 200 "Purged";

 

error 404 "Not in cache";

 

} else if (req.http.Accept­Encoding ~ "deflate") {

 

set req.http.Accept­Encoding = "deflate";

 

} else {

 

# unknown algorithm

 

remove req.http.Accept­Encoding;

 

}

 

}

 

Keďže Varnish cachuje iba nezmenené súbory, zmena v HTTP hlavičkách znamená, že sa súbor cachovať nebude. CMS väčšinou nastavujú pomerne veľa hlavičiek, pričom však v prípade statického obsahu toto nie je želané.

 

if (req.request != "GET" &&

 

req.request != "HEAD" &&

 

req.request != "PUT" &&

 

req.request != "POST" &&

 

req.request != "TRACE" &&

 

req.request != "OPTIONS" &&

 

req.request != "DELETE") {

 

/* Non­RFC2616 or CONNECT which is weird. */

 

pipe;

 

}

 

Cachovanie iba requestov typu GET a POST docielime cez:

 

if (req.request != "GET" && req.request != "HEAD") {

 

}

 

if (req.http.Cookie) {

 

and special persistent p_* cookies.

 

/* We only deal with GET and HEAD by default */

 

pass;

 

# We only care about the "__ac.*" cookies, used for authentication

 

if (req.http.Cookie ~ "__ac.*" ) {

 

}

 

# Else strip all cookies

 

remove req.http.Cookie;

 

}

 

Pre zamedzenie cachovania AJAX requestov vo Wordpresse a pristupov vyžadujúcich si prihlásenie:

 

if (req.http.Cookie ~ "wordpress_logged_in_") {

 

return (pipe);

 

}

 

# don't cache for users logged into WP backend

 

if (req.http.Cookie ~ "wordpress_logged_in_") {

 

return (pipe);

 

}

 

if (req.url ~ "wp­(login|admin)" || req.url ~ "preview=true" || req.url ~ "xmlrpc.php" ) {

 

return (pipe);

 

}

 

# don't cache ajax requests

 

if (req.http.X­Requested­With == "XMLHttpRequest") {

 

return (pipe);

 

}

 

následne je potrebné reštartovať Apache2 a Varnish .

 

service apache2 restart

 

service varnish start