Patroon voor hosting van statische inhoud

Azure Storage

Statische inhoud implementeren naar een opslagservice in de cloud die de inhoud rechtstreeks aan de client kan leveren. Daardoor is het niet altijd meer nodig om potentieel dure rekenprocessen te gebruiken.

Context en probleem

Webtoepassingen bevatten doorgaans enkele elementen van statische inhoud. Deze statische inhoud kan HTML-pagina's en andere resources bevatten, zoals afbeeldingen en documenten die beschikbaar zijn voor de client als onderdeel van een HTML-pagina (zoals inline-afbeeldingen, opmaakmodellen en JavaScript-bestanden aan de clientzijde) of als afzonderlijke downloads (zoals PDF-documenten).

Hoewel webservers zijn geoptimaliseerd voor dynamische rendering en uitvoercaching, moeten ze nog steeds aanvragen verwerken om statische inhoud te downloaden. Dat kost verwerkingscycli die vaak beter voor iets anders kunnen worden ingezet.

Oplossing

In de meeste cloudhostingomgevingen kunt u enkele resources en statische pagina's van een toepassing in een opslagservice plaatsen. De opslagservice kan aanvragen voor deze resources verwerken, waardoor de belasting van de rekenresources die andere webaanvragen verwerken, wordt verminderd. De kosten voor cloud-gebaseerde opslag zijn doorgaans veel minder dan voor rekenprocessen.

Bij het hosten van sommige onderdelen van een toepassing in een opslagservice hebben de belangrijkste overwegingen betrekking op de implementatie van de toepassing en op het beveiligen van resources die niet voor anonieme gebruikers zijn bedoeld.

Problemen en overwegingen

Beschouw de volgende punten als u besluit hoe u dit patroon wilt implementeren:

  • De gehoste opslagservice moet een HTTP-eindpunt beschikbaar maken waar gebruikers de statische resources kunnen downloaden. Sommige opslagservices bieden ook ondersteuning voor HTTPS, zodat het mogelijk is om resources te hosten in opslagservices die SSL vereisen.

  • Voor optimale prestaties en beschikbaarheid kunt u overwegen een Content Delivery Network (CDN) te gebruiken om de inhoud van de opslagcontainer op te slaan in meerdere datacenters verspreid over de wereld. Maar u moet dan waarschijnlijk wel betalen voor gebruik van het CDN.

  • Opslagaccounts zijn vaak standaard geogerepliceerd zodat ze tolerantie bieden voor gebeurtenissen die invloed kunnen hebben op een datacenter. Dit betekent dat wel het IP-adres kan veranderen, maar dat de URL hetzelfde blijft.

  • Wanneer sommige inhoud zich in een opslagaccount bevindt en andere inhoud zich in een gehost rekenproces bevindt, wordt het lastiger om de toepassing te implementeren en bij te werken. Mogelijk moet u afzonderlijke implementaties uitvoeren en de toepassing en inhoud versien om deze eenvoudiger te beheren, met name wanneer de statische inhoud scriptbestanden of UI-onderdelen bevat. Als er echter alleen statische resources moeten worden bijgewerkt, kunnen die gewoon worden geüpload naar het opslagaccount zonder dat het toepassingspakket moet worden geïmplementeerd.

  • Opslagservices bieden mogelijk geen ondersteuning voor het gebruik van aangepaste domeinnamen. In dit geval is het nodig om de volledige URL van de resources in koppelingen op te geven, omdat ze zich in een ander domein bevinden dan de dynamisch gegenereerde inhoud die de koppelingen bevat.

  • De opslagcontainers moeten zodanig worden geconfigureerd dat iedereen ze kan lezen, maar anderzijds is het van cruciaal belang dat ze niet door iedereen geschreven kunnen worden, om te voorkomen dat gebruikers inhoud kunnen uploaden.

  • Overweeg om een valetsleutel of token te gebruiken om de toegang tot resources te beheren die niet anoniem beschikbaar moeten zijn. Zie het valetsleutelpatroon voor meer informatie.

Wanneer dit patroon gebruiken

Dit patroon is handig voor:

  • Minimaliseren van de hostingkosten van websites en toepassingen die enige statische resources bevatten.

  • Minimaliseren van de hostingkosten van websites die alleen bestaan uit statische inhoud en resources. Afhankelijk van de mogelijkheden van het opslagsysteem van de hostingprovider, is het mogelijk om een volledig statische website in een opslagaccount te hosten.

  • Beschikbaar maken van statische resources en inhoud voor toepassingen die worden uitgevoerd in andere hostingomgevingen of lokale servers.

  • Zoeken naar inhoud in meer dan één geografisch gebied met een netwerk voor contentlevering (CDN) dat de inhoud van het opslagaccount in meerdere datacenters verspreid over de wereld opslaat.

  • Bewaken van kosten en bandbreedtegebruik. Door een afzonderlijk opslagaccount voor een deel van of alle statische inhoud te gebruiken, kunnen de kosten eenvoudiger worden gescheiden van hosting- en runtime-kosten.

Dit patroon is wellicht niet geschikt in de volgende situaties:

  • De toepassing moet een aantal processen voor de statische inhoud uitvoeren voordat deze naar de client kan worden gestuurd. Het kan bijvoorbeeld nodig zijn om een tijdstempel aan een document toe te voegen.

  • Het volume van statische inhoud is erg klein. De overheadkosten voor het ophalen van deze inhoud uit een afzonderlijke opslag kunnen hoger zijn dan het kostenvoordeel als de opslag wordt gescheiden van de rekenresource.

Workloadontwerp

Een architect moet evalueren hoe het patroon Static Content Hosting kan worden gebruikt in het ontwerp van hun workload om de doelstellingen en principes te verhelpen die worden behandeld in de pijlers van het Azure Well-Architected Framework. Voorbeeld:

Pijler Hoe dit patroon ondersteuning biedt voor pijlerdoelen
Kostenoptimalisatie is gericht op het ondersteunen en verbeteren van het rendement van uw workload op investering. Dynamische toepassingshosts zijn meestal duurder dan statische hosts, omdat dynamische hosts uw gecodeerde bedrijfslogica kunnen uitvoeren. Het gebruik van een toepassingsplatform voor het leveren van statische inhoud is niet rendabel.

- CO:09 Stroomkosten
- CO:10 Gegevenskosten
Prestatie-efficiëntie helpt uw workload efficiënt te voldoen aan de vereisten door optimalisaties in schalen, gegevens, code. Het offloaden van verantwoordelijkheid voor een externe host helpt congestie te beperken en stelt u in staat uw toepassingsplatform alleen te gebruiken om bedrijfslogica te leveren.

- PE:07 Codeer een infrastructuur

Net als bij elke ontwerpbeslissing moet u rekening houden met eventuele compromissen ten opzichte van de doelstellingen van de andere pijlers die met dit patroon kunnen worden geïntroduceerd.

Opmerking

Azure Storage biedt ondersteuning voor het rechtstreeks leveren van statische inhoud vanuit een opslagcontainer. Bestanden worden verwerkt via anonieme toegangsaanvragen. Bestanden hebben standaard een URL in een subdomein van core.windows.net, zoals https://contoso.z4.web.core.windows.net/image.png. U kunt een aangepaste domeinnaam configureren en Azure CDN gebruiken voor toegang tot de bestanden via HTTPS. Zie Statische websitehosting in Azure Storage voor meer informatie.

Statische onderdelen van een toepassing rechtstreeks vanuit een opslagservice leveren

Statische websitehosting maakt de bestanden beschikbaar voor anonieme toegang. Als u wilt bepalen wie toegang heeft tot de bestanden, kunt u bestanden opslaan in Azure Blob Storage en vervolgens handtekeningen voor gedeelde toegang genereren om de toegang te beperken.

De koppelingen op de pagina's die aan de client worden geleverd, moeten de volledige URL van de resource opgeven. Als de resource is beveiligd met een valetsleutel, zoals een handtekening voor gedeelde toegang, moet deze handtekening worden opgenomen in de URL.

Een voorbeeldtoepassing die laat zien hoe u externe opslag gebruikt voor statische resources, is beschikbaar op GitHub. In dit voorbeeld worden configuratiebestanden gebruikt om het opslagaccount en de container op te geven die de statische inhoud bevat.

<Setting name="StaticContent.StorageConnectionString"
         value="UseDevelopmentStorage=true" />
<Setting name="StaticContent.Container" value="static-content" />

De Settings-klasse in het bestand Settings.cs van het project StaticContentHosting.Web bevat methoden om deze waarden op te halen en een string-waarde samen te stellen met de URL van de accountcontainer voor de cloudopslag.

public class Settings
{
  public static string StaticContentStorageConnectionString {
    get
    {
      return RoleEnvironment.GetConfigurationSettingValue(
                              "StaticContent.StorageConnectionString");
    }
  }

  public static string StaticContentContainer
  {
    get
    {
      return RoleEnvironment.GetConfigurationSettingValue("StaticContent.Container");
    }
  }

  public static string StaticContentBaseUrl
  {
    get
    {
        var blobServiceClient = new BlobServiceClient(StaticContentStorageConnectionString);

        return string.Format("{0}/{1}", blobServiceClient.Uri.ToString().TrimEnd('/'), StaticContentContainer.TrimStart('/'));
    }
  }
}

De StaticContentUrlHtmlHelper-klasse in het bestand StaticContentUrlHtmlHelper.cs beschrijft een methode met de naam StaticContentUrl die een URL genereert met daarin het pad naar de cloudopslagaccount als de URL die aan dit account wordt doorgegeven, begint met het teken voor het pad naar de ASP.NET-hoofdmap (~).

public static class StaticContentUrlHtmlHelper
{
  public static string StaticContentUrl(this HtmlHelper helper, string contentPath)
  {
    if (contentPath.StartsWith("~"))
    {
      contentPath = contentPath.Substring(1);
    }

    contentPath = string.Format("{0}/{1}", Settings.StaticContentBaseUrl.TrimEnd('/'),
                                contentPath.TrimStart('/'));

    var url = new UrlHelper(helper.ViewContext.RequestContext);

    return url.Content(contentPath);
  }
}

Het bestand Index.cshtml in de map Views\Home bevat een element van de installatiekopie dat gebruikmaakt van de StaticContentUrl-methode om de URL voor het bijbehorende src-kenmerk te maken.

<img src="@Html.StaticContentUrl("~/media/orderedList1.png")" alt="Test Image" />

Volgende stappen

  • Valet-sleutelpatroon. Als de doelbronnen niet beschikbaar moeten zijn voor anonieme gebruikers, gebruikt u dit patroon om directe toegang te beperken.
  • Serverloze webtoepassing in Azure. Een referentiearchitectuur die gebruikmaakt van statische websitehosting met Azure Functions om een serverloze web-app te implementeren.