Wzorzec hostingu zawartości statycznej

Azure Storage

Wdrażanie zawartości statycznej w usłudze magazynu opartej na chmurze, która może dostarczyć ją bezpośrednio do klienta. Może ono zmniejszyć zapotrzebowanie na potencjalnie kosztowne wystąpienia obliczeniowe.

Kontekst i problem

Aplikacje internetowe zazwyczaj zawierają jakieś elementy zawartości statycznej. Zawartość statyczna może obejmować strony HTML i inne zasoby, takie jak obrazy i dokumenty, które są dostępne dla klienta jako część strony HTML (np. wbudowane obrazy, arkusze stylów i pliki JavaScript po stronie klienta) lub jako osobne pliki do pobrania (np. dokumenty PDF).

Mimo że serwery internetowe są zoptymalizowane pod kątem dynamicznego renderowania i buforowania danych wyjściowych, nadal muszą obsługiwać żądania pobierania zawartości statycznej. Powoduje to zużycie cykli przetwarzania, które często można wykorzystać w lepszy sposób.

Rozwiązanie

W większości środowisk hostingu w chmurze niektóre zasoby aplikacji i strony statyczne można umieścić w usłudze magazynu. Usługa magazynu może obsługiwać żądania dla tych zasobów, zmniejszając obciążenie zasobów obliczeniowych obsługujących inne żądania internetowe. Koszt magazynu hostowanego w chmurze jest zwykle dużo mniejszy niż koszt wystąpień obliczeniowych.

W przypadku hostowania niektórych części aplikacji w usłudze magazynu najważniejsze kwestie są związane z wdrożeniem aplikacji oraz zabezpieczaniem zasobów, które nie mają być dostępne dla użytkowników anonimowych.

Problemy i kwestie do rozważenia

Podczas podejmowania decyzji o sposobie wdrożenia tego wzorca należy rozważyć następujące punkty:

  • Hostowana usługa magazynu musi udostępniać punkt końcowy HTTP, do którego użytkownicy mogą uzyskać dostęp, aby pobrać zasoby statyczne. Niektóre usługi magazynu obsługują także protokół HTTPS, dlatego istnieje możliwość hostowania zasobów w usługach magazynu wymagających protokołu SSL.

  • Aby uzyskać maksymalną wydajność i dostępność, rozważ buforowanie zawartości kontenera magazynu w wielu centrach danych na całym świecie przy użyciu sieci dostarczania zawartości (CDN). Jednak korzystanie z usługi CDN prawdopodobnie będzie wymagało opłat.

  • Domyślnie konta magazynu często korzystają z replikacji geograficznej, aby zapewnić odporność na zdarzenia, które mogą mieć wpływ na centrum danych. Oznacza to, że adres IP może ulec zmianie, ale adres URL pozostanie taki sam.

  • Gdy część zawartości znajduje się na koncie magazynu, a inna zawartość znajduje się w hostowanym wystąpieniu obliczeniowym, staje się trudniejsze do wdrożenia i zaktualizowania aplikacji. Może być konieczne przeprowadzenie oddzielnych wdrożeń oraz wersjonowanie aplikacji i zawartości w celu łatwiejszego zarządzania nią — szczególnie wtedy, gdy zawartość statyczna zawiera pliki skryptów lub składniki interfejsu użytkownika. Jednak jeśli mają zostać zaktualizowane tylko zasoby statyczne, można po prostu przekazać je na konto magazynu bez konieczności ponownego wdrażania pakietu aplikacji.

  • Usługi magazynu mogą nie obsługiwać korzystania z niestandardowych nazw domen. W takim przypadku należy określić pełny adres URL zasobów w linkach, ponieważ będą one znajdować się w innej domenie niż dynamicznie generowana zawartość zawierająca linki.

  • Kontenery magazynu muszą być skonfigurowane na potrzeby publicznego dostępu do odczytu, ale koniecznie należy upewnić się, że nie skonfigurowano dla nich publicznego dostępu do zapisu, aby uniemożliwić użytkownikom przekazywanie zawartości.

  • Rozważ użycie klucza lub tokenu valet, aby kontrolować dostęp do zasobów, które nie powinny być dostępne anonimowo. Aby uzyskać więcej informacji, zobacz wzorzec klucza valet.

Kiedy używać tego wzorca

Ten wzorzec jest przydatny w przypadku:

  • Minimalizacja kosztu hostingu witryn internetowych i aplikacji zawierających jakieś zasoby statyczne.

  • Minimalizacja kosztu hostingu witryn internetowych składających się tylko z zawartości statycznej i zasobów. W zależności od możliwości systemu magazynu dostawcy hostingu może być możliwe całkowite hostowanie w pełni statycznej witryny internetowej na koncie magazynu.

  • Udostępnianie zasobów statycznych i zawartości dla aplikacji działających w innych środowiskach hostingu lub na innych serwerach lokalnych.

  • Wyszukiwanie zawartości w więcej niż jednym obszarze geograficznym przy użyciu sieci dostarczania zawartości, która buforuje zawartość konta magazynu w wielu centrach danych na całym świecie.

  • Monitorowanie kosztów i użycia przepustowości. Używając oddzielnego konta magazynu dla części lub całości zawartości statycznej, można łatwiej oddzielić koszty hostingu od kosztów środowiska wykonawczego.

Ten wzorzec może nie być użyteczny w następujących sytuacjach:

  • Aplikacja musi wykonać jakieś operacje przetwarzania na zawartości statycznej przed dostarczeniem jej do klienta. Na przykład może być konieczne dodanie sygnatury czasowej do dokumentu.

  • Ilość zawartości statycznej jest bardzo mała. Koszty pobierania tej zawartości z oddzielnego magazynu mogą przeważyć zalety oddzielenia jej od zasobu obliczeniowego.

Projekt obciążenia

Architekt powinien ocenić, w jaki sposób wzorzec hostingu zawartości statycznej może być używany w projekcie obciążenia, aby sprostać celom i zasadom opisanym w filarach platformy Azure Well-Architected Framework. Na przykład:

Filar Jak ten wzorzec obsługuje cele filaru
Optymalizacja kosztów koncentruje się na utrzymaniu i poprawie zwrotu obciążenia z inwestycji. Hosty aplikacji dynamicznych są zwykle droższe niż hosty statyczne, ponieważ hosty dynamiczne mogą uruchamiać zakodowaną logikę biznesową. Korzystanie z platformy aplikacji w celu dostarczania zawartości statycznej nie jest opłacalne.

- CO:09 Koszty przepływu
- CO:10 Koszty danych
Wydajność pomagawydajnie sprostać zapotrzebowaniu dzięki optymalizacjom skalowania, danych, kodu. Odciążanie odpowiedzialności za zewnętrznego hosta pomaga ograniczyć przeciążenie i umożliwia używanie platformy aplikacji tylko do dostarczania logiki biznesowej.

- PE:07 Kod infrastruktury

Podobnie jak w przypadku każdej decyzji projektowej, należy rozważyć wszelkie kompromisy w stosunku do celów innych filarów, które mogą zostać wprowadzone przy użyciu tego wzorca.

Przykład

Usługa Azure Storage obsługuje obsługę zawartości statycznej bezpośrednio z kontenera magazynu. Pliki są obsługiwane za pośrednictwem anonimowych żądań dostępu. Domyślnie pliki mają adres URL w poddomenie typu core.windows.net, na przykład https://contoso.z4.web.core.windows.net/image.png. Możesz skonfigurować niestandardową nazwę domeny i użyć usługi Azure CDN, aby uzyskać dostęp do plików za pośrednictwem protokołu HTTPS. Aby uzyskać więcej informacji, zobacz Statyczna witryna internetowa hostująca w usłudze Azure Storage.

Dostarczanie statycznych części aplikacji bezpośrednio z usługi magazynu

Statyczna witryna internetowa hostująca udostępnia pliki na potrzeby dostępu anonimowego. Jeśli musisz kontrolować, kto może uzyskiwać dostęp do plików, możesz przechowywać pliki w usłudze Azure Blob Storage, a następnie generować sygnatury dostępu współdzielonego, aby ograniczyć dostęp.

Linki na stronach dostarczonych do klienta muszą określać pełny adres URL zasobu. Jeśli zasób jest chroniony za pomocą klucza valet, takiego jak sygnatura dostępu współdzielonego, ten podpis musi być uwzględniony w adresie URL.

Przykładowa aplikacja, która demonstruje używanie magazynu zewnętrznego dla zasobów statycznych, jest dostępna w witrynie GitHub. W tym przykładzie użyto plików konfiguracji do określenia konta magazynu i kontenera zawierającego zawartość statyczną.

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

Klasa Settings w pliku Settings.cs projektu StaticContentHosting.Web zawiera metody wyodrębniania tych wartości i tworzenia wartości ciągu zawierającej adres URL kontenera konta magazynu w chmurze.

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

Klasa StaticContentUrlHtmlHelper w pliku StaticContentUrlHtmlHelper.cs udostępnia metodę o nazwie StaticContentUrl, która generuje adres URL zawierający ścieżkę do konta magazynu w chmurze, jeśli przekazany adres URL zaczyna się od znaku ścieżki katalogu głównego 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);
  }
}

Plik Index.cshtml w folderze Views\Home zawiera element obrazu, który używa metody StaticContentUrl do tworzenia adresu URL dla jego atrybutu src.

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

Następne kroki

  • Przykład hostingu zawartości statycznej. Przykładowa aplikacja, która demonstruje ten wzorzec.
  • Wzorzec klucza portiera. Jeśli zasoby docelowe nie mają być dostępne dla użytkowników anonimowych, użyj tego wzorca, aby ograniczyć bezpośredni dostęp.
  • Bezserwerowa aplikacja internetowa na platformie Azure. Architektura referencyjna, która używa statycznej witryny internetowej hostingu z usługą Azure Functions do implementowania bezserwerowej aplikacji internetowej.