Cdn řešení
Co je CDN¶
Při návštěvě webové aplikace zákazníkem musí prohlížeč stáhnout všechny soubory na které navštěvovaná stránka odkazuje, v případě, že je zákazník od Vašeho webového serveru vzdálen, může díky tomu docházet k velké prodlevě při načítaní webu.
Naše CDN má rozmístěny v různých lokacích cache servery a pokud CDN použijete, nemusí zákazníci stahovat statický obsah z Vašeho vzdáleného web serveru, ale jsou obslouženi z cache serveru který je k nim umístěný mnohem blíže a načtení webu je díky tomu mnohem rychlejší.
Hlavní výhody CDN spočivají tedy v:
- Rychlejším načítaní webu pro zakazníky.
- Snížení zatěže Vašich webových serverů.
- Částečné ochraně před DDoS útoky.
Lokalita¶
K dispozici máme nyní lokality Evropa, USA a Globalní. U evropy se jedná o dvě lokality v Praze a jednu lokalitu v Londýně, Madridu a Bukurešti. V případě USA poté o New York.
Při výběru lokality je nutné myslet na skutečnost, že přes tuto lokality musí chodit veškerý traffic, který jde přes CDN doménu/alias. V případě, kdy je vybraná lokality US, tak dochází k tomu, že všichni návštěvnící jsou odbaveni přes tuhle lokality, nikoli k tomu, že CDN je aktivní pouze ve vybrané lokality. Pokud jsou tedy návštěvníci hlavně z Evropy, není pravděpodobně výběr US dobrou volbou.
Zprovoznění služby¶
- Při vytvoření služby CDN je Vám předána CDN doména přes kterou je nutné směrovat načítaní statického obsahu, například pokud budete chtít využívat CDN pro web example.com, bude Vám vytvořena doména example.vshcdn.net.
- Programátoři na webu upraví odkazy na statický obsah, nahradí example.com za example.vshcdn.net.
- CDN se již sama díky anycast technologii a specialně nakonfigurovaným DNS serverům postará o to, aby prohlížeč uživatele webu stahoval statický obsah vždy z nejbližšího serveru.
Seznam IP adres serverů¶
V současné době může CDN načítat obsah z Vašich serverů z následujích ip:
93.185.110.99/32
93.185.110.100/32
93.185.110.101/32
185.198.191.147/32
204.145.66.226/32
77.81.119.26/32
86.105.155.150/32
185.115.0.0/24
77.247.124.1/32
46.243.53.13/32
Případně následujících IPv6 adres:
2a05:91c0:504::4571/128
2a00:1d70:ffff:ffff:ffff:ffff:ffff:1/128
2a00:1ed0:0:213::11/128
2a00:1ed0:0:213::12/128
2a00:1ed0:0:213::13/128
2a0a:54c0:0:34::2/128
2001:1980:5102:ea82::2/128
2a02:5420:1::/48
2a00:1ed0:3:1::6/128
2a00:1ed0:3:2::6/128
2a00:1ed0:3:3::6/128
2001:1980:5102:ea84::6/128
2a05:91c0:504:4571::11/128
2a00:1d70:a002::11/128
2a0a:54c1:28::6/128
2a0a:54c1:29::6/128
2a00:1ed2:1::13:1/128
2a00:1ed0:3:1::101/128
2a00:1ed0:3:2::101/128
2a00:1ed0:3:3::101/128
2001:1980:5102:ea84::101/128
2a0a:54c1:28::101/128
2a0a:54c1:29::101/128
IP adresy se můžou časem měnit, seznam ip můžete také získavat pomocí GET požadavku na url seznamu IP adres serverů, v tomto případě Vám bude vrácen seznam ip adres, kde použitý oddělovač je '\n' (nový řádek). Oba seznamy naleznete na následujících odkazech: IPv4 a IPv6
Získání IP adresy návštěvníka¶
Abyste mohli zjistit IP návštěvníka, proxy server vyplní návštěvníkovu IP do hlavičky "CDN-VSHOSTING-Real-IP". Je však nutné, aby jste webový server nakonfigurovali tak, aby této hlavičce důvěřoval pouze v případě, pokud je požadavek proveden z ip proxy serveru, seznam ip je uveden výše.
Konfigurace může vypadat následovně:
nginx:
set_real_ip_from 93.185.110.99;
set_real_ip_from 93.185.110.100;
set_real_ip_from 93.185.110.101;
set_real_ip_from 185.115.0.0/24;
set_real_ip_from 204.145.66.224;
set_real_ip_from 204.145.66.156;
set_real_ip_from 185.198.191.147;
set_real_ip_from 204.145.66.226;
set_real_ip_from 204.145.66.158;
set_real_ip_from 77.81.119.26;
set_real_ip_from 86.105.155.150;
real_ip_header CDN-VSHOSTING-Real-IP;
apache:
RPAFenable On
RPAFproxy_ips 93.185.110.99 93.185.110.100 93.185.110.101 185.115.0.0/24 204.145.66.224 204.145.66.156 185.198.191.147 204.145.66.226 204.145.66.158 77.81.119.26 86.105.155.150 RPAFheader CDN-VSHOSTING-Real-IP
Zjištení ip adresy v php:
function get_realip() {
$real_ip = $_SERVER[REMOTE_ADDR]
$cdn_ip = array("93.185.110.99", "93.185.110.100", "93.185.110.101", "204.145.66.224", "204.145.66.156", "185.198.191.147" "204.145.66.226", "204.145.66.158", "77.81.119.26", "86.105.155.150"); if (in_array($_SERVER[REMOTE_ADDR], $cdn_ip)) { $real_ip = $_SERVER[HTTP_CDN_VSHOSTING_REAL_IP]; } return $real_ip; }
Nastavení doby cachování¶
K nastavení doby po kterou je obsah nacachován je možné využít hlavičky "Cache-Control" a "Expires", "Cache-Control" má širší možnosti nastavení.
Pokud budete chtít cachovat obsah po dobu maximalně 10 minut je potřeba nastavit hlavičku Cache-Control nasledovně:
"Cache-Control: public, max-age=600"
Poté můžeme do .htaccess a nebo přímo do konfigurace virtualhostu v apache vložit nasledující konfiguraci:
<FilesMatch "\.png$">
Header set Cache-Control max-age=3600
</FilesMatch>
Díky tomuto nastavení, bude CDN cachovat png soubory po dobu maximalně jedné hodiny, po vypršení této doby si CDN při dalším dotazu ověří zda došlo ke změně souboru.
Funkce Vynucení mezipaměti¶
Pro nastavení doby cachování můžeme také využít funkci Vynucení mezipaměti v administraci CDN. Při zapnutí této funkce jsou nacachovány veškeré odpovědi na nastavenou dobu, a to včetně těch, které by díky hlavičkám běžně nacachovány nebyly.
Při zapnutí této funkce tedy dochází k ignorování například následujících hlaviček:
- X-Accel-Expires
- Expires
- Cache-Control
- Set-Cookie
Hlavičky ale nejsou pozměněny. Hlavičky (včetně Set-Cookie
) jsou na klienta zaslány v podobě, v jaké je zaslal backend. Pokud tedy bude nastaveno Cache-Control: no-cache
, obsah se na CDN bude cachovat po dobu nastavenou pomocí Vynucení mezipaměti, zatímco v prohlížeči k cachování docházet nebude.
Při použití této funkce je potřeba si dát pozor, aby na doméně nebyl žádný dynamický obsah, nebo obsah, jehož načtení způsobuje nastavení cookies pomocí Set-Cookie
.
Přidání hlavičky Cache-Control - php¶
Pro nastavení hlavičky Cache-Control použijeme funkci header:
header("Cache-Control: max-age=600");
Funkci header je potřeba zavolat ještě předtím, než odešlete jakýkoli obsah, funkci je tedy potřeba v kódu volat co nejdříve.
GeoIP omezení¶
Nastavením GeoIP omezení můžeme omezit přístup webu prostřednictvím CDN na státy, které buď povolíme či zakážeme. GeoIP mód funguje buď v režimu Blacklistu nebo v režimu Whitelistu.
Po výběru režimu můžeme v dropdown menu vybírat, které státy chceme blokovat, či naopak povolit. Je možné zvolit více států.
Remote Log¶
Přístupové logy z CDN je možné odesílat na vzdálený server k vlastní analýze, k dispozici je Syslog, RabiitMQ a Loggly.
Autokonverze do WebP¶
Tato funkce umožňuje převádět soubory .bmp, .png, .jpg a .jpeg (respektive soubory odpovídající tomuto regulárnímu výrazu ".(?:bmp|png|jpg|jpeg)$" ) do formátu webp pro distribuci prostřednictvím CDN. Více informací o tomto formátu můžete nalézt např. zde: https://en.wikipedia.org/wiki/WebP . Podpora WebP prohlížečem je detekována pomocí hlavičky Accept-Encoding. Prohlížečům, které tuto technologii nepodporují je poslán obrázek v původním formátu. Po zapnutí této funkce je nutné minimálně hodinu počkat, než budou zkonvertované soubory dostupné. S tímto též souvisí nastavení hlavičky Cache-Control nebo Expires, které musí být minimálně na jednu hodinu. Lze také nastavit pomocí nastavení Vynucení mezipaměti v administraci CDN a to opět minimálně jednu hodinu (3600 vteřin). Pokud jsou v CDN obrázky již nacachované, tak je nutné je z CDN nejprve odstranit, aby se mohla konverze provést. viz. Vynucení mezipaměti. Konverzi lze vypnout přidáním argumentu vshcdn-webp-noautconvert=1 do URL, nebo nastavením hlavičky VSHCDN-WEBP-NOAUTOCONVERT=1 na backendu.
Při použití této funkce jsou následovány redirecty interně v CDN a obrázek je vrácen klientovy s původní url, v případě, že potřebujete opačné chování nás prosím kontaktujte pomocí ticketu s informací, pro kterou doménu si přejete danou funkcionalitu přenastavit.
Vymazat cache¶
Prostřednictvím administrace CDN je možné odstranit nacachovanou URL z CDN. U každé domény je možnost Vymazat cache. Po jejím rozkliknutí se Vám nabídne možnost zadat až 20 URL ke smazání. Pokud je potřeba smazat cache pro doménu kompletně, stačí zadat "https://webshop.xy/*"