Příručka:Kešování přes Varnish
Varnish je lehký a efektivní reverzní proxy server[1], který zkracuje čas potřebný k obsluhování často požadovaných stránek.
Varnish je HTTP akcelerátor, který ukládá kopie stránek obsluhovaných webovým serverem. Při příštím požadavku na stejnou stránku Varnish poskytne kopii namísto vyžádání stránky ze serveru Apache. Tento proces ukládání do mezipaměti odstraňuje potřebu, aby MediaWiki znovu obnovovala stejnou stránku, což má za následek ohromné zvýšení výkonu.[2]
Varnish má tu výhodu, že je navržen speciálně pro použití jako HTTP akcelerátor (reverzní proxy). Ukládá většinu dat uložených v mezipaměti do paměti, čímž vytváří méně diskových souborů a méně přístupů k souborovému systému než větší, víceúčelový balíček na Squid . Stejně jako Squid poskytuje často požadované stránky uživatelům s anonymními IP z mezipaměti místo toho, aby je požadoval z původního webového serveru. To snižuje využití procesoru i přístup k databázi základním serverem MediaWiki.
Kvůli tomuto zvýšení výkonu byla MediaWiki navržena tak, aby se úzce integrovala s webovou mezipamětí a upozorní Squid nebo Varnish, když by měla být stránka vymazána z mezipaměti, aby byla obnovena.
Z pohledu MediaWiki je správně nakonfigurovaná instalace Varnish zaměnitelná se svým protějškem Squid.
Architektura
Níže je uveden příklad nastavení Varnish, Apache a MediaWiki na jednom serveru. Složitější strategie ukládání do mezipaměti může používat více webových serverů za stejnými mezipamětmi Varnish (všechny mohou vypadat jako jeden hostitel) nebo používat nezávislé servery k doručování obsahu wiki nebo obrázků.
Venkovní svět | ↔ |
Server
|
Pro vnější svět se zdá, že Varnish funguje jako webový server. Ve skutečnosti předává požadavky na webový server Apache, ale pouze v případě potřeby. Apache běžící na stejném serveru pouze naslouchá požadavkům z localhost (127.0.0.1), zatímco Varnish naslouchá pouze požadavkům na externí IP adrese serveru. Obě služby běží na portu 80 bez konfliktu, protože každá je vázána na jinou IP adresu.
Nastavujeme Varnish
Následující konfigurace funguje pro Varnish verze 4 a vyšší.
vcl 4.0;
# set default backend if no server cluster specified
backend default {
.host = "127.0.0.1";
.port = "8080";
# .port = "80" led to issues with competing for the port with apache.
}
# access control list for "purge": open to only localhost and other local nodes
acl purge {
"127.0.0.1";
}
# vcl_recv is called whenever a request is received
sub vcl_recv {
# Serve objects up to 2 minutes past their expiry if the backend
# is slow to respond.
# set req.grace = 120s;
set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
set req.backend_hint= default;
# This uses the ACL action called "purge". Basically if a request to
# PURGE the cache comes from anywhere other than localhost, ignore it.
if (req.method == "PURGE") {
if (!client.ip ~ purge) {
return (synth(405, "Not allowed."));
} else {
return (purge);
}
}
# Pass requests from logged-in users directly.
# Only detect cookies with "session" and "Token" in file name, otherwise nothing get cached.
if (req.http.Authorization || req.http.Cookie ~ "([sS]ession|Token)=") {
return (pass);
} /* Not cacheable by default */
# normalize Accept-Encoding to reduce vary
if (req.http.Accept-Encoding) {
if (req.http.User-Agent ~ "MSIE 6") {
unset 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 {
unset req.http.Accept-Encoding;
}
}
return (hash);
}
sub vcl_pipe {
# Note that only the first request to the backend will have
# X-Forwarded-For set. If you use X-Forwarded-For and want to
# have it set for all requests, make sure to have:
# set req.http.connection = "close";
# This is otherwise not necessary if you do not do any request rewriting.
set req.http.connection = "close";
}
# Called if the cache has a copy of the page.
sub vcl_hit {
if (!obj.ttl > 0s) {
return (pass);
}
}
# Called after a document has been successfully retrieved from the backend.
sub vcl_backend_response {
# Don't cache 50x responses
if (beresp.status == 500 || beresp.status == 502 || beresp.status == 503 || beresp.status == 504) {
set beresp.uncacheable = true;
return (deliver);
}
if (!beresp.ttl > 0s) {
set beresp.uncacheable = true;
return (deliver);
}
if (beresp.http.Set-Cookie) {
set beresp.uncacheable = true;
return (deliver);
}
if (beresp.http.Authorization && !beresp.http.Cache-Control ~ "public") {
set beresp.uncacheable = true;
return (deliver);
}
return (deliver);
}
Nastavujeme MediaWiki
Protože Varnish provádí požadavky z localhost, Apache obdrží "127.0.0.1" jako přímou vzdálenou adresu. Jak však Varnish předává požadavky Apache, je nakonfigurován tak, aby přidal hlavičku :X-Forwarded-For:, aby byla zachována vzdálená adresa z vnějšího světa. MediaWiki musí být nakonfigurováno tak, aby používala hlavičku "X-Forwarded-For", aby správně zobrazovala adresy uživatelů v special:recentchanges.
Požadovaná konfigurace je stejná pro Squid i pro Varnish. Ujistěte se, že soubor LocalSettings.php obsahuje následující řádky:
$wgUseCdn = true;
$wgCdnServers = [ '127.0.0.1', '192.168.0.1' ];
//Use $wgCdnServersNoPurge if you don't want MediaWiki to purge modified pages
//$wgCdnServersNoPurge = [ '192.168.0.2' ];
Nezapomeňte nahradit '192.168.0.1' IP adresou, na které naslouchá vaše mezipaměť Varnish. Tato nastavení slouží ke dvěma účelům:
- Pokud je přijat požadavek z mezipaměti Varnish serveru, musí protokoly MediaWiki zobrazovat IP adresu uživatele, nikoli adresu Varnish. special:recentchanges, ve kterém je každá úprava hlášena jako '127.0.0.1', je téměř k ničemu. Uvedení této adresy jako serveru Squid/Varnish říká MediaWiki, aby ignorovala IP adresu a místo toho se podívala na hlavičku 'x-forwarded-for' pro IP uživatele.
- Pokud dojde ke změně stránky nebo obrázku na wiki, MediaWiki zašle upozornění na každý server uvedený v $wgCdnServers , že má zahodit (vymazat) zastaralou uloženou stránku.
Použijte $wgCdnServersNoPurge pro adresy, které je třeba chránit před nedávnými změnami, ale které nepřijímají zprávy HTTP PURGE. Například, pokud jsou Apache a Squid na 127.0.0.1 a externí adresa na stejném počítači, není potřeba posílat Apache "očišťovací" zprávu určenou pro Squid. Stejně tak, pokud Squid poslouchá více adres, pošlete "purge" pouze na jednu z nich.
Viz také Nastavení konfigurace Squid pro všechna nastavení související s ukládáním do mezipaměti Squid/Varnish.
Pokud používáte HTTPS, nezapomeňte nastavit $wgInternalServer na stejnou hodnotu jako $wgServer , ale s protokolem http://, abyste zabránili odesílání požadavků na vyčištění jako HTTPS, protože Varnish HTTPS nepodporuje.
If using $wgForceHTTPS , be sure to send request header "X-Forwarded-Proto: https" to suppress the redirect, otherwise disable $wgForceHTTPS to prevent redirect loops.
Několik poznámek
Všimněte si, že Varnish je alternativou k Squid, ale nenahrazuje jiné části kompletní strategie ukládání do mezipaměti MediaWiki, jako například:
- Předkompilovaný PHP kód
- Výchozí chování PHP pod Apache je načíst a interpretovat PHP webové skripty při každém přístupu. Instalace mezipaměti, jako je APC (
yum install php-pecl-apc
, poté alokovat paměť nastavenímapc.shm_size=128
nebo lepší na/etc/php.d/apc.ini
), může výrazně snížit množství času procesoru, který Apache potřebuje k poskytování obsahu PHP. - Lokalizace/Internacionalizace
- Ve výchozím nastavení MediaWiki vytvoří obrovskou databázovou tabulku na
l10n_cache
a bude k ní neustále přistupovat - možná více než zdvojnásobení zatížení databázového serveru po "aktualizaci" na nejnovější verzi MediaWiki. Nastavením $wgLocalisationCacheConf vynutíte uložení lokalizačních informací do systému souborů, abyste to napravili. - Proměnné a data relace
- Ukládání proměnných dat, jako je postranní panel MediaWiki, seznam jmenných prostorů nebo černá listina spamu, do mezipaměti podstatně zvýší rychlost instalace MediaWiki. Vynucení uložení uživatelských přihlašovacích údajů na společném místě je také nezbytné pro každou instalaci, ve které je za stejnými mezipamětmi Varnish skryto více zaměnitelných serverů Apache, aby obsluhovaly stránky pro stejné wikiny. Nainstalujte balíček memcached a nastavte následující možnosti v LocalSettings.php , abyste přinutili jak přihlašovací údaje uživatele, tak proměnné uložené v mezipaměti používat memcache:
$wgMainCacheType = CACHE_MEMCACHED;
$wgMemCachedServers = [ '127.0.0.1:11211' ];
- Pamatujte, že pokud máte více serverů, adresu localhost je třeba nahradit adresou sdíleného serveru (serverů) v memcachingu, který musí být stejný pro všechny odpovídající webové servery na vašem webu. . To zajišťuje, že přihlášení uživatele na jeden server v clusteru jej přihlásí do wiki na všech vyměnitelných webových serverech.
V mnoha případech existuje několik alternativních přístupů k ukládání do mezipaměti, které přinesou stejný výsledek. Podívejte se na stránku Příručka:Ukládání do mezipaměti .
Nastavení Apache
Soubory protokolu
Protokol webového serveru Apache ve výchozím nastavení zobrazuje pouze adresu serveru mezipaměti Varnish, v tomto příkladu "127.0.0.1:80"
Apache může být nakonfigurován tak, aby zaznamenával adresu původního uživatele zachycováním informací "x-forwarded-for" ve vlastním formátu souboru protokolu.[3]
Příklad pro httpd.conf Apache pro konfiguraci protokolování x-forwarded-for je:
LogFormat "%{X-Forwarded-for}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" cached
Hotlinking obrázků
Pokud web používá mod_rewrite
Apache k blokování pokusů jiných webů o horké odkazy na obrázky, bude nutné tuto konfiguraci odstranit a přidat do konfiguračních souborů Varnish ekvivalentní konfiguraci.
Tam, kde je obrázkový server umístěn za Varnishem, obvykle 90 % nebo více běžných požadavků na obrázky nikdy nedorazí na Apache, a proto nebudou blokovány kontrolou "http_referer" v konfiguracích Apache.
Související odkazy