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ý
aptget update
aptget install varnish
takisto je vhodné inštalovať pre ručné volanie jeho funkcií utilitu curl
aptget 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/sitesenabled/*
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.AcceptEncoding) {
if (req.url ~ „\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$“) {
# No point in compressing these
remove req.http.AcceptEncoding;
} else if (req.http.AcceptEncoding ~ „gzip“) {
set req.http.AcceptEncoding = „gzip“;
purge_url(req.url);
error 200 „Purged“;
error 404 „Not in cache“;
} else if (req.http.AcceptEncoding ~ „deflate“) {
set req.http.AcceptEncoding = „deflate“;
} else {
# unknown algorithm
remove req.http.AcceptEncoding;
}
}
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“) {
/* NonRFC2616 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.XRequestedWith == „XMLHttpRequest“) {
return (pipe);
}
následne je potrebné reštartovať Apache2 a Varnish .
service apache2 restart
service varnish start