Mönster för värddator för statiskt innehåll

Azure Storage

Distribuera statiskt innehåll till en molnbaserad lagringstjänst som kan leverera innehållet direkt till klienten. Detta kan minska behovet av potentiellt dyra beräkningsinstanser.

Kontext och problem

Webbprogram omfattar normalt vissa delar med statiskt innehåll. Det här statiska innehållet kan omfatta HTML-sidor och andra resurser, t.ex. bilder och dokument som är tillgängliga för klienten, antingen som en del av en HTML-sida (t.ex. infogade bilder, formatmallar och klientens JavaScript-filer) eller som separata nedladdningar (t.ex. PDF-dokument).

Även om webbservrar är optimerade för dynamisk rendering och cachelagring av utdata måste de fortfarande hantera begäranden om att ladda ned statiskt innehåll. Det använder bearbetningscykler som ofta skulle kunna användas på ett bättre sätt.

Lösning

I de flesta molnvärdmiljöer kan du placera några av ett programs resurser och statiska sidor i en lagringstjänst. Lagringstjänsten kan hantera begäranden för dessa resurser, vilket minskar belastningen på de beräkningsresurser som hanterar andra webbbegäranden. Kostnaden för molnbaserad lagring är vanligtvis mycket lägre än för beräkningsinstanser.

Om en del av ett program hostas i en lagringstjänst är de saker som är viktigast att tänka på relaterade till distribution av programmet och att skydda resurser som inte är avsedda att vara tillgängliga för anonyma användare.

Problem och överväganden

Tänk på följande när du bestämmer hur du ska implementera mönstret:

  • Den värdbaserade lagringstjänsten måste exponera en HTTP-slutpunkt som användarna kan komma åt för att hämta statiska resurser. En del lagringstjänster har också stöd för HTTPS, så det är möjligt att hosta resurser i lagringstjänster som kräver SSL.

  • Överväg att använda ett innehållsleveransnätverk (CDN) för att cachelagra innehållet i lagringscontainern i flera datacenter runtom i världen för maximal prestanda och tillgänglighet. Du behöver dock troligtvis betala för att använda CDN.

  • Lagringskonton är ofta geo-replikerade som standard för att ge elasticitet mot händelser som kan påverka ett datacenter. Det innebär att IP-adressen kan ändras, men URL-adressen förblir densamma.

  • När en del innehåll finns i ett lagringskonto och annat innehåll finns i en värdbaserad beräkningsinstans blir det svårare att distribuera och uppdatera programmet. Du kan behöva utföra separata distributioner och versionshantera programmet och innehållet för att hantera det enklare, särskilt när det statiska innehållet innehåller skriptfiler eller gränssnittskomponenter. Men om endast statiska resurser behöver uppdateras kan de helt enkelt överföras till lagringskontot utan att programpaketet behöver distribueras om.

  • Lagringstjänsterna kanske inte har stöd för användning av anpassade domännamn. I det här fallet är det nödvändigt att ange den fullständiga URL:en för resurserna i länkar eftersom de finns i en annan domän än det dynamiskt genererade innehållet som innehåller länkarna.

  • Lagringscontainrarna måste konfigureras för publik läsåtkomst, men det är viktigt att se till att de inte konfigureras för publik skrivåtkomst för att förhindra att användarna kan överföra innehåll.

  • Överväg att använda en betjäntnyckel eller token för att kontrollera åtkomsten till resurser som inte ska vara tillgängliga anonymt. Mer information finns i Valet Key-mönstret .

När du ska använda det här mönstret

Det här mönstret är användbart för:

  • Minimera värdkostnaden för webbplatser och program som innehåller en del statiska resurser.

  • Minimera värdkostnaden för webbplatser som endast består av statiskt innehåll och resurser. Beroende på funktionerna i värdleverantörens lagringssystem kan det vara möjligt att helt vara värd för en helt statisk webbplats i ett lagringskonto.

  • Exponera statiska resurser och innehåll för program som körs i andra värdmiljöer eller lokala servrar.

  • Hitta innehåll i mer än ett geografiskt område med hjälp av ett nätverk för innehållsleverans som cachelagrar innehållet i lagringskontot i flera datacenter runtom i världen.

  • Övervaka kostnader och bandbreddsanvändning. Om ett separat lagringskonto används för en del av eller allt statiskt innehåll kan kostnaderna enklare skiljas från värd- och körningskostnader.

Det här mönstret kanske inte är användbart i följande situationer:

  • Programmet måste utföra viss bearbetning av det statiska innehållet innan det levereras till klienten. Det kan till exempel vara nödvändigt att lägga till en tidsstämpel i ett dokument.

  • Mängden statiskt innehåll är mycket liten. Omkostnaden för att hämta det här innehållet från separat lagring kan uppväga kostnadsfördelen med att skilja det från beräkningsresursen.

Design av arbetsbelastning

En arkitekt bör utvärdera hur mönstret Värd för statiskt innehåll kan användas i arbetsbelastningens design för att uppfylla de mål och principer som beskrivs i grundpelarna i Azure Well-Architected Framework. Till exempel:

Grundpelare Så här stöder det här mönstret pelarmål
Kostnadsoptimering fokuserar på att upprätthålla och förbättra arbetsbelastningens avkastning på investeringen. Dynamiska programvärdar är vanligtvis dyrare än statiska värdar eftersom dynamiska värdar kan köra din kodade affärslogik. Det är inte kostnadseffektivt att använda en programplattform för att leverera statiskt innehåll.

- CO:09 Flödeskostnader
- CO:10 Datakostnader
Prestandaeffektivitet hjälper din arbetsbelastning att effektivt uppfylla kraven genom optimeringar inom skalning, data och kod. Om du avlastar ansvaret till en extern värd kan du minska överbelastningen och du kan bara använda din programplattform för att leverera affärslogik.

- PE:07 Koda en infrastruktur

Som med alla designbeslut bör du överväga eventuella kompromisser mot målen för de andra pelarna som kan införas med det här mönstret.

Exempel

Azure Storage stöder hantering av statiskt innehåll direkt från en lagringscontainer. Filer hanteras via anonyma åtkomstbegäranden. Som standard har filer en URL i en underdomän för core.windows.net, till exempel https://contoso.z4.web.core.windows.net/image.png. Du kan konfigurera ett anpassat domännamn och använda Azure CDN för att komma åt filerna via HTTPS. Mer information finns i Värd för statiska webbplatser i Azure Storage.

Leverera statiska delar av ett program direkt från en lagringstjänst

Värdtjänster för statiska webbplatser gör filerna tillgängliga för anonym åtkomst. Om du behöver styra vem som kan komma åt filerna kan du lagra filer i Azure Blob Storage och sedan generera signaturer för delad åtkomst för att begränsa åtkomsten.

Länkarna på de sidor som levereras till klienten måste ange resursens fullständiga URL. Om resursen skyddas med en betjäntnyckel, till exempel en signatur för delad åtkomst, måste den här signaturen inkluderas i URL:en.

Ett exempelprogram som visar hur du använder extern lagring för statiska resurser finns på GitHub. Det här exemplet använder konfigurationsfiler för att ange lagringskontot och containern som innehåller det statiska innehållet.

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

Settings-klassen i filen Settings.cs för projektet StaticContentHosting.Web innehåller metoder för att extrahera dessa värden och skapa ett strängvärde som innehåller molnlagringskontots container-URL.

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('/'));
    }
  }
}

StaticContentUrlHtmlHelper-klassen i filen StaticContentUrlHtmlHelper.cs exponerar en metod med namnet StaticContentUrl som genererar en URL som innehåller sökvägen till molnlagringskontot om den URL som skickas till den börjar med rotsökvägstecknet för ASP.NET (~).

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);
  }
}

Filen Index.cshtml i mappen Views\Home innehåller ett bildelement som använder metoden StaticContentUrl för att skapa URL-adressen för dess src-attribut.

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

Nästa steg

  • Exempel på värd för statiskt innehåll. Ett exempelprogram som visar det här mönstret.
  • Valet-nyckelmönster. Om målresurserna inte ska vara tillgängliga för anonyma användare använder du det här mönstret för att begränsa direkt åtkomst.
  • Serverlöst webbprogram i Azure. En referensarkitektur som använder statiska webbplatsvärdar med Azure Functions för att implementera en serverlös webbapp.