Model hostování statického obsahu

Azure Storage

Nasazuje statický obsah do služby cloudového úložiště, která ho může doručit přímo klientovi. Může se tak snížit potřeba potenciálně drahých výpočetních instancí.

Kontext a problém

Webové aplikace obvykle obsahují některé prvky statického obsahu. Tento statický obsah by mohl zahrnovat stránky HTML a další prostředky, například image a dokumenty, které má k dispozici klient jako součást stránky HTML (například vložené obrázky, šablony stylů a soubory JavaScript na straně klienta) nebo jako samostatné soubory ke stažení (jako jsou například dokumenty PDF).

I když jsou webové servery optimalizované pro dynamické vykreslování a ukládání výstupu do mezipaměti, musí zpracovávat požadavky na stahování statického obsahu. Takto se spotřebovávají cykly zpracování, které by často bylo možné využít lepším způsobem.

Řešení

Ve většině cloudových hostitelských prostředí můžete do služby úložiště umístit některé prostředky aplikace a statické stránky. Služba úložiště může obsluhovat požadavky na tyto prostředky, což snižuje zatížení výpočetních prostředků, které zpracovávají jiné webové požadavky. Náklady na úložiště hostované v cloudu jsou obvykle mnohem menší, než je tomu u výpočetních instancí.

Při hostování některých částí aplikace v úložišti služby je nutné zvážit hlavně nasazení aplikace a zabezpečení prostředků, které nemají být dostupné anonymním uživatelům.

Problémy a důležité informace

Když se budete rozhodovat, jak tento model implementovat, měli byste vzít v úvahu následující skutečnosti:

  • Hostovaná služba úložiště musí vystavit koncový bod protokolu HTTP, ke kterému můžou získat uživatelé přístup, aby si mohli stáhnout statické prostředky. Některé služby úložiště také podporují protokol HTTPS, takže je možné hostovat prostředky ve službách úložiště, které vyžadují protokol SSL.

  • Aby bylo možné dosáhnout maximálního výkonu a dostupnosti, zvažte možnost použít síť CDN k ukládání obsahu mezipaměti do kontejneru úložiště v několika datových centrech po celém světě. Za použití sítě CDN pravděpodobně bude nutné platit.

  • Účty úložiště se často ve výchozím nastavení georeplikují, aby se zajistila odolnost vůči událostem, které můžou ovlivnit datové centrum. To znamená, že se může změnit IP adresa, ale adresa URL zůstane stejná.

  • Když se nějaký obsah nachází v účtu úložiště a další obsah je v hostované výpočetní instanci, bude nasazení a aktualizace aplikace náročnější. Možná budete muset provést samostatná nasazení a spravovat aplikaci a obsah, abyste ji mohli snadněji spravovat – zejména pokud statický obsah obsahuje soubory skriptů nebo komponenty uživatelského rozhraní. Pokud je ale potřeba aktualizovat jenom statické prostředky, je možné je jednoduše odeslat na účet úložiště, aniž by bylo potřeba znovu nasazovat balíček aplikace.

  • Služby úložiště nemusí podporovat používání vlastních názvů domén. V tomto případě je nutné zadat úplnou adresu URL prostředků v odkazech, protože budou v jiné doméně než dynamicky generovaný obsah obsahující odkazy.

  • Kontejnery úložiště musí být nakonfigurované pro veřejný přístup pro čtení, ale je důležité zajistit, aby neměly nakonfigurovaný veřejný přístup k zápisu, aby uživatelé nemohli nahrát obsah.

  • Zvažte použití osobního klíče nebo tokenu k řízení přístupu k prostředkům, které by neměly být k dispozici anonymně. Další informace najdete v modelu Valet Key.

Kdy se má tento model použít

Tento model je vhodný pro:

  • Minimalizace nákladů na hostování pro weby a aplikace, které obsahují některé statické prostředky.

  • Minimalizace nákladů na hostování pro weby, které obsahují jenom statický obsah a prostředky. V závislosti na možnostech systému úložiště poskytovatele hostingu může být možné plně hostovat plně statický web v účtu úložiště.

  • Vystavení statických prostředků a obsahu pro aplikace běžící v jiných hostingových prostředích nebo na místních serverech.

  • Vyhledání obsahu ve více zeměpisných oblastech pomocí sítě pro doručování obsahu, která ukládá obsah účtu úložiště do mezipaměti v několika datových centrech po celém světě.

  • Sledování nákladů a využití šířky pásma. Použití účtu samostatného úložiště pro veškerý statický obsah nebo jeho část umožňuje jednodušeji oddělit náklady od nákladů na hosting a runtime.

Tento model nemusí být vhodný v následujících situacích:

  • Aplikace potřebuje před doručením do klienta nějakým způsobem zpracovat statický obsah. Může být například potřeba přidat k dokumentu časové razítko.

  • Objem statického obsahu je velmi malý. Nevýhody, které přinese režie načítání tohoto obsahu z různých úložišť, můžou převážit nad výhodami oddělení obsahu od výpočetního prostředku.

Návrh úloh

Architekt by měl vyhodnotit způsob použití modelu Statického hostování obsahu v návrhu úlohy k řešení cílů a principů popsaných v pilířích architektury Azure Well-Architected Framework. Příklad:

Pilíř Jak tento model podporuje cíle pilíře
Optimalizace nákladů se zaměřuje na udržení a zlepšení návratnosti vašich úloh. Hostitelé dynamických aplikací jsou obvykle dražší než statická hostitelé, protože dynamické hostitele můžou spouštět zakódovanou obchodní logiku. Použití aplikační platformy k doručování statického obsahu není nákladově efektivní.

- CO:09 Náklady na tok
- CO:10 Náklady na data
Efektivita výkonu pomáhá vaší úloze efektivně splňovat požadavky prostřednictvím optimalizací škálování, dat a kódu. Snižování zodpovědnosti na externalizovaného hostitele pomáhá zmírnit přetížení a umožňuje používat aplikační platformu pouze k poskytování obchodní logiky.

- PE:07 Kódování infrastruktury

Stejně jako u jakéhokoli rozhodnutí o návrhu zvažte jakékoli kompromisy proti cílům ostatních pilířů, které by mohly být s tímto vzorem zavedeny.

Příklad

Azure Storage podporuje obsluhu statického obsahu přímo z kontejneru úložiště. Soubory se obsluhují prostřednictvím anonymních žádostí o přístup. Ve výchozím nastavení mají soubory adresu URL v subdoméně core.windows.net, například https://contoso.z4.web.core.windows.net/image.png. Můžete nakonfigurovat vlastní název domény a použít Azure CDN pro přístup k souborům přes HTTPS. Další informace najdete v tématu Hostování statického webu ve službě Azure Storage.

Doručování statických částí aplikace přímo ze služby úložiště

Hostování statického webu zpřístupňuje soubory pro anonymní přístup. Pokud potřebujete řídit, kdo má k souborům přístup, můžete je uložit do úložiště objektů blob v Azure a pak vygenerovat sdílené přístupové podpisy , abyste omezili přístup.

Odkazy na stránkách doručovaných klientovi musí obsahovat úplnou adresu URL prostředku. Pokud je prostředek chráněný pomocí osobního klíče, jako je sdílený přístupový podpis, musí být tento podpis součástí adresy URL.

Ukázková aplikace, která demonstruje použití externího úložiště pro statické prostředky, je k dispozici na GitHubu. Tato ukázka používá konfigurační soubory k určení účtu úložiště a kontejneru, který obsahuje statický obsah.

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

Třída Settings v souboru Settings.cs v projektu StaticContentHosting.Web obsahuje metody pro extrakci těchto hodnot a vytvoření řetězcové hodnoty obsahující adresu URL kontejneru účtu úložiště v cloudu.

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

Třída StaticContentUrlHtmlHelper v souboru StaticContentUrlHtmlHelper.cs zpřístupní metodu s názvem StaticContentUrl, která generuje adresy URL obsahující cestu k účtu úložiště v cloudu, pokud předaná adresa URL začíná znakem kořenové cesty 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);
  }
}

Soubor Index.cshtm ve složce Views\Home obsahuje element image, který používá metodu StaticContentUrl k vytvoření adresy URL pro svůj atribut src.

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

Další kroky

  • Ukázka hostování statického obsahu Ukázková aplikace, která ukazuje tento vzor.
  • Model osobního klíče: Pokud cílové prostředky nemají být dostupné anonymním uživatelům, použijte tento vzor k omezení přímého přístupu.
  • Bezserverová webová aplikace v Azure Referenční architektura, která k implementaci bezserverové webové aplikace používá hostování statických webů s Azure Functions.