{"id":2280,"date":"2018-08-18T10:19:38","date_gmt":"2018-08-18T08:19:38","guid":{"rendered":"http:\/\/miroslaw.borodziuk.eu\/?p=2280"},"modified":"2018-08-18T20:47:40","modified_gmt":"2018-08-18T18:47:40","slug":"content-delivery-network-cdn","status":"publish","type":"post","link":"http:\/\/miro.borodziuk.eu\/index.php\/2018\/08\/18\/content-delivery-network-cdn\/","title":{"rendered":"Content Delivery Network (CDN)"},"content":{"rendered":"<p><em>Content Delivery Network<\/em> to sie\u0107 serwer\u00f3w, kt\u00f3re w spos\u00f3b efektywny dostarczaj\u0105 zawarto\u015b\u0107 stron webowych do u\u017cytkownik\u00f3w. Aby zminimalizowa\u0107 op\u00f3\u017anienia w dostarczaniu tre\u015bci CDN cachuje kontent w serwerach brzegowych najbli\u017cszych u\u017cytkownikom.<\/p>\n<p><!--more--><\/p>\n<p>Tworzenie profilu CDN przy pomocy portalu Azure odbywa si\u0119 przez klikni\u0119cia:<\/p>\n<p><em>All resources<\/em> -&gt; <em>Add<\/em> -&gt; <em>Mobile<\/em> -&gt; <em>CDN<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2284 size-full\" src=\"http:\/\/miroslaw.borodziuk.eu\/wp-content\/uploads\/CDNProfile.jpg\" alt=\"\" width=\"312\" height=\"798\" srcset=\"http:\/\/miro.borodziuk.eu\/wp-content\/uploads\/CDNProfile.jpg 312w, http:\/\/miro.borodziuk.eu\/wp-content\/uploads\/CDNProfile-117x300.jpg 117w\" sizes=\"(max-width: 312px) 100vw, 312px\" \/><\/p>\n<p>Do wyboru mamy kilka opcji cen (<em>Pricing tier<\/em>). Tworzymy dla naszego CDNa od razu stosowne zako\u0144czenie (endpoint).<\/p>\n<p>Tworzenie CDN i zako\u0144czenia przy pomocy PowerShella:<\/p>\n<pre class=\"lang:ps decode:true\">PS&gt; New-AzureRmCdnProfile -ProfileName cdn01 -ResourceGroupName RG01 -Sku Standard_Akamai -Location \"Central US\"\r\nPS&gt; New-AzureRmCdnEndpoint -ProfileName cdn01 -ResourceGroupName RG01 -Location \"Central US\" -EndpointName cdn01endpoint  -OriginName \"Contoso\" -OriginHostName \"www.contoso.com\"<\/pre>\n<p>To samo ale w jednej linii:<\/p>\n<pre class=\"lang:ps decode:true\">PS&gt; New-AzureRmCdnProfile -ProfileName cdn01 -ResourceGroupName RG01 -Sku Standard_Akamai -Location \"Central US\" | New-AzureRmCdnEndpoint -EndpointName cdn01endpoint -OriginName \"Contoso\" -OriginHostName \"www.contoso.com\"<\/pre>\n<p>Wi\u0119cej o zarz\u0105dzaniu CDN przez PowerShella:<\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/pl-pl\/azure\/cdn\/cdn-manage-powershell\">https:\/\/docs.microsoft.com\/pl-pl\/azure\/cdn\/cdn-manage-powershell<\/a><\/p>\n<p>Blobsy z publicznym dost\u0119pem sk\u0142adowane w kontenerach zostaj\u0105 replikowane do zako\u0144cze\u0144 CDN. Aby uzyska\u0107 dost\u0119p do zawarto\u015bci naszego CDNa zamieniamy adresy URL odnosz\u0105ce si\u0119 do blobs\u00f3w na adresy zako\u0144cze\u0144 CDN.<\/p>\n<p>Stary adres:<\/p>\n<p><code>http:\/\/storageaccount.blob.core.windows.net\/imgs\/logo.png<\/code><\/p>\n<p>zamieniamy na zako\u0144czenie CDN:<\/p>\n<p><code> <i>http:\/\/[CDN endpoint name].azureedget.net\/imgs\/logo.png<\/i><\/code><\/p>\n<p>CDN cachuje pliki tak d\u0142ugo jak okre\u015bla to parametr time-to-live (TTL) zawarty w nag\u0142\u00f3wkach CacheControl HTTP. Je\u017celi oryginalny serwer, z kt\u00f3rego pochodzi strona nie okre\u015bla TTL to CDN domy\u015blnie przyjmuje 7 dni.<\/p>\n<p>CacheControl na plikach blob mo\u017cna ustawia\u0107 podczas wgrywania plik\u00f3w na storage przy pomocy:<\/p>\n<ul>\n<li>StorageExplorera<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2292 size-full\" src=\"http:\/\/miroslaw.borodziuk.eu\/wp-content\/uploads\/StorrageExplorerCacheControl.jpg\" alt=\"\" width=\"508\" height=\"595\" srcset=\"http:\/\/miro.borodziuk.eu\/wp-content\/uploads\/StorrageExplorerCacheControl.jpg 508w, http:\/\/miro.borodziuk.eu\/wp-content\/uploads\/StorrageExplorerCacheControl-256x300.jpg 256w\" sizes=\"(max-width: 508px) 100vw, 508px\" \/><\/p>\n<ul>\n<li>PowerShella<\/li>\n<\/ul>\n<pre class=\"lang:ps decode:true\">PS C:\\&gt; $ResourceGroup = \"RG01\"\r\nPS C:\\&gt; $StorageAccountName = \"mystorageaccount0002\"\r\nPS C:\\&gt; $StorageAccountKey = (Get-AzureRmStorageAccountKey -ResourceGroupName $ResourceGroup -AccountName $StorageAccountName).Value[0]\r\nPS C:\\&gt; $context = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey\r\nPS C:\\&gt; $filesPath = \"D:\\Pictures\"\r\nPS C:\\&gt; $container = \"mycontainer03\"\r\nPS C:\\&gt; New-AzureStorageContainer -Name $container -Context $context -Permission Blob\r\n\r\nBlob End Point: https:\/\/mystorageaccount0002.blob.core.windows.net\/\r\n\r\nName PublicAccess LastModified\r\n---- ------------ ------------\r\nmycontainer03 Blob 2018-08-18 13:01:38 +00:00\r\n\r\n\r\nPS C:\\&gt; Get-ChildItem $filesPath | foreach {\r\nPS C:\\&gt; $contentType = \"img\/png\"\r\nPS C:\\&gt; $cacheControl = \"public, max-age=86400\"\r\nPS C:\\&gt; $blobProperties = @{ContentType=$contentType; CacheControl=$cacheControl}\r\nPS C:\\&gt; Set-AzureStorageBlobContent -File $_.FullName -Container $container -Context $context -Properties $blobProperties }<\/pre>\n<p><code>Max-age<\/code> ustawiamy w sekundach, 86400 sek. to 24 h.<\/p>\n<p>S\u0105 dwa sposoby na usuni\u0119cie kontentu z CDN zale\u017cne od tego w jaki spos\u00f3b kontent zosta\u0142 dodany do CDN:<\/p>\n<ul>\n<li>Kontent jest w storagu &#8211; mo\u017cna ustawi\u0107 kontener jako prywatny albo wykasowa\u0107 kontent z konternera, czy te\u017c wykasowa\u0107 sam kontener.<\/li>\n<li>Kontent jest w us\u0142udze lub stronie webowej Azure &#8211; mo\u017cna zmodyfikowa\u0107 aplikacj\u0119 aby ju\u017c nie serwowa\u0142a danego kontentu. Mo\u017cna tak\u017ce wyaksowa\u0107 zako\u0144czenie CDN (endpoint) ale stracimy wtedy dost\u0119p do innych tre\u015bci w nim zawartych.<\/li>\n<\/ul>\n<p>Kontent usuni\u0119ty ze storaga lub niedost\u0119pny z aplikacji webowej pozostaje w CDN a\u017c do czasu okre\u015blonego przez TTL. Za po\u015brednictwem portalu Azure istnieje mo\u017cliwo\u015b\u0107 natychmiastowego usuni\u0119cia kontentu:<\/p>\n<p><em>All resources<\/em> -&gt; <em>[Nazwa CDN]<\/em> -&gt; <em>Purge<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2298 size-full\" src=\"http:\/\/miroslaw.borodziuk.eu\/wp-content\/uploads\/CDN-Purge.jpg\" alt=\"\" width=\"431\" height=\"326\" srcset=\"http:\/\/miro.borodziuk.eu\/wp-content\/uploads\/CDN-Purge.jpg 431w, http:\/\/miro.borodziuk.eu\/wp-content\/uploads\/CDN-Purge-300x227.jpg 300w\" sizes=\"(max-width: 431px) 100vw, 431px\" \/><\/p>\n<p>Pole <em>Content path<\/em> powy\u017cszego okna dialogowego wspiera wyra\u017cenia regularne. Wyra\u017cenia regularne i opcja <em>Purge all<\/em> nie jest jednak wspierana aktualnie przez CDN Akamai.\u00a0 Wi\u0119cej o opcji Purge tutaj:<\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/cdn\/cdn-purge-endpoint\">https:\/\/docs.microsoft.com\/en-us\/azure\/cdn\/cdn-purge-endpoint<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Innym sposobem kontrolowania cachowanych w CDN tre\u015bci s\u0105 <em>query strips<\/em> (ci\u0105gi zapyta\u0144), o czy mo\u017cna poczyta\u0107 tutaj:<\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/cdn\/cdn-query-string\">https:\/\/docs.microsoft.com\/en-us\/azure\/cdn\/cdn-query-string<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Dane s\u0105 keszowane w CDN dopiero gdy po raz pierwsze pojawia si\u0119 o nie zapytanie, co oznacza \u017ce za pierwszym razem czas dost\u0119pu do takich danych przez u\u017cytkownika ko\u0144cowego jest wi\u0119kszy, poniewa\u017c dane musz\u0105 zosta\u0107 pobrane z serwera, z kt\u00f3rego pochodz\u0105, nie mog\u0105 by\u0107 odczytane z keszu. CDN Verizon umo\u017cliwia pre-\u0142adowanie danych do keszu dzi\u0119ki czemu mo\u017cliwe jest uniikni\u0119cie op\u00f3\u017anienia w dost\u0119pie do danych.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Configuring custom domains.<\/span><\/p>\n<p>Konta Azure Storage oraz Azure CDN daj\u0105 mo\u017cliwo\u015b\u0107 dost\u0119pu do danych przy pomocy specjalnych nazw domenowych zamiast u\u017cywania URLi Azure (np. mystorageaccount.core.windows.net). S\u0105 na to dwie metody.<\/p>\n<ol>\n<li>Tworzymy odpowiedni rekord CNAME u dostawcy, kt\u00f3ry utrzymuje nasz\u0105 domen\u0119.<br \/>\n<table border=\"1\">\n<tbody>\n<tr>\n<td><em>Rekord CNAME<\/em><\/td>\n<td><em>Cel<\/em><\/td>\n<\/tr>\n<tr>\n<td><code>www.nazwa.com<\/code><\/td>\n<td><code><br \/>\nmystorageaccount.blob.core.windows.net<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Ta metoda jest prostsza ale mo\u017ce spowodowa\u0107 kr\u00f3tki przest\u00f3j podczas weryfikacji przez Azure czy domena jest zarejestrowana u dostawcy. W portalu Azure klikamy:<code>\u00a0All resources<\/code> -&gt; <code>mystorageaccount<\/code> -&gt; <code>Custom domain<\/code>-&gt; wpisujemy nasz\u0105 nazw\u0119 domenow\u0105 (<code>www.nazwa.com<\/code>).<\/li>\n<li>U rejestratora domen rejestrujemy domen\u0119 po\u015bredni\u0105, daj\u0105c przedrostek <code>asverify<\/code> przed nazw\u0105 domenow\u0105. Dodaj\u0105c ten przedrostek do swojej nazwy domenowej pozwalasz Azure na rozpoznawanie Twojej nazwy domenowej bez modyfikowania rekordu DNS dla tej domeny.<\/li>\n<\/ol>\n<table style=\"width: 579px;\" border=\"1\">\n<tbody>\n<tr>\n<td style=\"width: 266.25px;\"><em>Rekord CNAME<\/em><\/td>\n<td style=\"width: 296.95px;\"><em>Cel<\/em><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 266.25px;\"><code>asverify.www.nazwa.com<\/code><\/td>\n<td style=\"width: 296.95px;\"><code>asverify.mystorageaccount.blob.core.windows.net<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>W portalu Azure klikamy:<code>\u00a0All resources<\/code> -&gt; <code>mystorageaccount<\/code> -&gt; <code>Custom domain<\/code>-&gt; wpisujemy nasz\u0105 nazw\u0119 domenow\u0105 (bez <code>asverify<\/code>tj. <code>www.nazwa.com<\/code>). Zahaczamy <em>Use indirect CNAME validation <\/em>i\u00a0 klikamy<em> SAVE.<\/em><\/p>\n<p>Po tym jak rekordy <code>asverify<\/code> zostan\u0105 zweryfikowane przez Azure dodajemy w\u0142a\u015bciw\u0105 nazw\u0119 domenow\u0105 do naszego DNS. Rekordy <code>asverify<\/code> mo\u017cna skasowa\u0107 poniewa\u017c nie s\u0105 po weryfikacji ju\u017c u\u017cywane.<\/p>\n<table border=\"1\">\n<tbody>\n<tr>\n<td><em>Rekord CNAME<\/em><\/td>\n<td><em>Cel<\/em><\/td>\n<\/tr>\n<tr>\n<td><code>www.nazwa.com<\/code><\/td>\n<td><code><br \/>\nmystorageaccount.blob.core.windows.net<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Aby usun\u0105\u0107 z portalu Azure nasz\u0105 nazw\u0119 domenow\u0105 wystarczy wej\u015b\u0107 do <code>\u00a0All resources<\/code> -&gt; <code>mystorageaccount<\/code> -&gt; <code>Custom domain<\/code> i usun\u0105\u0107 nasz\u0105 nazw\u0119 domenow\u0105.<\/p>\n<p>Mo\u017cna to tak\u017ce zrobi\u0107 w PowerShellu:<\/p>\n<pre class=\"lang:ps decode:true\">PS C:\\ Set-AzureRmStorageAccount  -ResourceGroupName \"&lt;resource-group-name&gt;\" -AccountName \"&lt;storage-account-name&gt;\" -CustomDomainName \"\"<\/pre>\n<p>Wi\u0119cej informacji o w\u0142asnych nazwach domenowych: <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/storage\/blobs\/storage-custom-domain-name#register-a-custom-domain\">https:\/\/docs.microsoft.com\/en-us\/azure\/storage\/blobs\/storage-custom-domain-name#register-a-custom-domain<\/a><\/p>\n<p>Dla zako\u0144cze\u0144 Azure CDN (endpoint) procedura jest prawie identyczna ale zamiast przedrostka <code>verify<\/code> korzystamy z przedrostka <code>cdnverify<\/code>.<\/p>\n<p>Wi\u0119cej informacji o w\u0142asnych nazwach domenowych dla zako\u0144cze\u0144 CDN:\u00a0 <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/cdn\/cdn-map-content-to-custom-domain\">https:\/\/docs.microsoft.com\/en-us\/azure\/cdn\/cdn-map-content-to-custom-domain<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Dokumentacja Microsoftu do CDN:<\/p>\n<p><a href=\"http:\/\/Wi\u0119cej o CDN:  https:\/\/docs.microsoft.com\/en-us\/azure\/cdn\/cdn-overview\">http:\/\/Wi\u0119cej o CDN: https:\/\/docs.microsoft.com\/en-us\/azure\/cdn\/cdn-overview<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Content Delivery Network to sie\u0107 serwer\u00f3w, kt\u00f3re w spos\u00f3b efektywny dostarczaj\u0105 zawarto\u015b\u0107 stron webowych do u\u017cytkownik\u00f3w. Aby zminimalizowa\u0107 op\u00f3\u017anienia w dostarczaniu tre\u015bci CDN cachuje kontent w serwerach brzegowych najbli\u017cszych u\u017cytkownikom.<\/p>\n","protected":false},"author":1,"featured_media":2281,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[70],"tags":[],"_links":{"self":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/2280"}],"collection":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/comments?post=2280"}],"version-history":[{"count":20,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/2280\/revisions"}],"predecessor-version":[{"id":2304,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/2280\/revisions\/2304"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media\/2281"}],"wp:attachment":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media?parent=2280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/categories?post=2280"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/tags?post=2280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}