Varnish je proxy server pro cachování výstupů webových aplikací. Nabízí vysokou míru konfigurovatelnosti a výrazně vyšší výkon a nižší spotřebu paměti. Při správné konfiguraci umožňuje serveru zvládnout mnohonásobně více návštevníků.
Varnish je nasazený před webový server a požadavky na portu 80. Poskytuje už předpřipravené HTML požadavky, čímž minimalizuje počet požadavků na které musí webserver vynaložit paměť a výkon CPU.
Jeho použití si vyžaduje v případe správy hostingů pomocí služby Server Manager dodatečnou konfiguraci po přidaní hostingu. Vhodný je zejména pokud na serveru běží pouze jeden hosting.
Přímou podporu pro Varnish mají následovné systémy:
- WordPress
- Multisite WordPress
- Magento
- Mediawiki
- Drupal
- Joomla
Problémy s nasazením Varnish jsme zaznamenali u :
- Moodle
- Prestashop
- SugarCRM
- Koken
Instalace Varnish
Ověřte, jestli je hostname serveru nastavený v souladu s DNS
hostname
hostname f
nainstalujeme balíček pro Varnish a případně další balíčky, na kterých je závislý
aptget update
aptget install varnish
také je vhodné nainstalovat pro ruční volání jeho funkcí utilitu curl
aptget install curl
Konfigurace Varnish
1. nastavíme Apache na port 8080 a Varnish na port 80
Standardně Varnish poslouchá na portu 6081, změníme ho na 80
nano /etc/default/varnish
najdeme 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 \
parametr si určuje úložiště pro data a jeho velikost. Pokud máte server s nižší RAM (512MB), doporučujeme ho změnit na s file,
/var/lib/varnish/$INSTANCE/varnish_storage.bin,96M“
také změníme parametr START = yes aby se Varnish spustil i po restartu serveru .
Před jeho spuštěním je však potřeba také nakonfigurovat i webserver:
nano /etc/apache2/ports.conf
listen 80;
změníme na
listen 8080;
Také je potřeba port změnit v konfiguračních souborech Apache2 pro hosting(y), můžete to udělat snadno pro všechny konfigurační soubory pomocí příkazu sed:
sed i ‚s/\:80/\:8080/‘ /etc/apache2/sitesenabled/*
Chování Varnish je možné upravit a ladit pomocí souboru /etc/varnish/default.vcl , protože je ale každá aplikace specifická, neexistuje univerzální nastavení, které funguje pro všechny.
Základním prvkem, ovlivňujícím chování Varnish, jsou HTTP hlavičky generované aplikací, webserverom nebo prohlížečem návštěvníka. Na webu je dostupných vícero návodů k jednotlivým aplikacím.
Podělíme se však o několik základních triků s ohledem na často používané CMS:
backend default {
.host = „127.0.0.1“;
.port = „8080“;
.first_byte_timeout = 300s;
}
zde se určuje standardní backend, kam jsou požadavky směřované, tedy v našem případě Apache2
Pokud byste potřebovali přidat další, je potřeba ho označit vlastní značkou, např.:
backend google {
.host = „209.85.229.106“; /*www.google.com“;*/
.port = „80“;
}
Pro ruční pročištění záznamu v cache se použije request typu PURGE na URL , která se má promazat. Které IP adresy mohou tento request poslat určuje direktiva acl_purge
acl purge {
„firemnyserver.noip.org“;
„wordpress.domena.tld“;
„domena.tld“;
„localhost“;
}
Následné pročištění dané URL je realizované v
sub vlc_recv{ přidáním
if (req.request == „PURGE“) {
if (!client.ip ~ purge) {
}
}
a v
sub vcl_hit {
if (req.request == „PURGE“) {
}
}
sub vcl_miss {
if (req.request == „PURGE“) {
}
}
Pro správná fungování gzip komprese je do sub vcl_recv {
na jeho začátek přidat
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;
}
}
Jelikož Varnish cachuje pouze nezměněné soubory, změna v HTTP hlavičkách znamená, že se soubor cachovat nebude. CMS většinou nastavují poměrně mnoho hlaviček, přičemž však v případě statického obsahu toto není potřeba.
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;
}
Cachování pouze requestů typu GET a POST docílíme přes:
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;
}
Pro zamezení cachování AJAX requestů ve WordPressu a přistupů vyžadujících si přihlášení:
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ásledně je potřeba restartovat Apache2 a Varnish .
service apache2 restart
service varnish start