Statik İçerik Barındırma düzeniStatic Content Hosting pattern

Statik içeriği, bunları doğrudan istemciye teslim edebilecek bulut tabanlı bir depolama hizmetine dağıtın.Deploy static content to a cloud-based storage service that can deliver them directly to the client. Bu yüksek maliyetlere neden olabilecek işlem örneklerine yönelik ihtiyacı azaltabilir.This can reduce the need for potentially expensive compute instances.

Bağlam ve sorunContext and problem

Web uygulamaları genellikle bazı statik içerik öğeleri içerir.Web applications typically include some elements of static content. Statik içerikler istemci tarafından kullanılabilen HTML sayfaları ve resimler veya belgeler gibi diğer kaynakları bir HTML sayfasının parçası olarak (örneğin satır içi resimler, stil sayfaları ve istemci tarafı JavaScript dosyaları) veya ayrı indirmeler (örneğin PDF belgeleri) olarak içerebilir.This static content might include HTML pages and other resources such as images and documents that are available to the client, either as part of an HTML page (such as inline images, style sheets, and client-side JavaScript files) or as separate downloads (such as PDF documents).

Web sunucuları dinamik işleme ve çıktı önbelleği için iyileştirilmiştir, ancak yine de statik içeriği indirmek için istekleri işlemek sahiptirler.Although web servers are optimized for dynamic rendering and output caching, they still have to handle requests to download static content. Bu, daha verimli olarak kullanılabilecek işlem döngülerinin harcanmasına neden olur.This consumes processing cycles that could often be put to better use.

ÇözümSolution

Çoğu bulut barındırma ortamında bir uygulamanın kaynaklarını ve statik sayfalarını bir depolama hizmetinde bazıları koyabilirsiniz.In most cloud hosting environments, you can put some of an application's resources and static pages in a storage service. Diğer web isteklerini işlemek işlem kaynakları üzerindeki yükü azaltarak, bu kaynaklar için istekleri depolama hizmetine görebilir.The storage service can serve requests for these resources, reducing load on the compute resources that handle other web requests. Bulutta barındırılan depolama için maliyetler genellikle işlem örneklerine göre çok daha düşüktür.The cost for cloud-hosted storage is typically much less than for compute instances.

Bir uygulamanın bazı bölümlerini bir depolama hizmetinde barındırırken, dikkat edilmesi gereken konular uygulamanın dağıtılmasıyla ve anonim kullanıcılar tarafından kullanılmaması gereken kaynakların güvenliğinin sağlanmasıyla ilgilidir.When hosting some parts of an application in a storage service, the main considerations are related to deployment of the application and to securing resources that aren't intended to be available to anonymous users.

Sorunlar ve dikkat edilmesi gerekenlerIssues and considerations

Bu düzenin nasıl uygulanacağına karar verirken aşağıdaki noktaları göz önünde bulundurun:Consider the following points when deciding how to implement this pattern:

  • Barındırılan depolama hizmeti kullanıcıların statik kaynakları indirmek için erişebileceği bir HTTP uç noktasını açığa çıkarmalıdır.The hosted storage service must expose an HTTP endpoint that users can access to download the static resources. Bazı depolama hizmetleri ayrıca HTTPS’yi de destekler, bu nedenle kaynakları SSL gerektiren depolama hizmetlerinde barındırmak mümkündür.Some storage services also support HTTPS, so it's possible to host resources in storage services that require SSL.

  • En yüksek performans ve kullanılabilirlik için, depolama kapsayıcısının içeriklerini dünyanın dört bir yanından birden fazla veri merkezinde önbelleğe almak üzere bir içerik teslim ağı (CDN) kullanmayı göz önünde bulundurun.For maximum performance and availability, consider using a content delivery network (CDN) to cache the contents of the storage container in multiple datacenters around the world. Ancak CDN kullanmak için genellikle bir ücret ödemeniz gerekir.However, you'll likely have to pay for using the CDN.

  • Depolama hesapları genellikle bir veri merkezini etkileyebilecek olaylara karşı dayanıklılık sunmak üzere varsayılan olarak coğrafi olarak çoğaltılır.Storage accounts are often geo-replicated by default to provide resiliency against events that might affect a datacenter. Bu, IP adresinin değişebileceği ancak URL’nin aynı kalacağı anlamına gelir.This means that the IP address might change, but the URL will remain the same.

  • Bazı içerikler bir depolama hesabında bulunan ve diğer içerikler barındırılan bilgi işlem örneğidir, dağıtma ve uygulamayı güncelleştirmek daha zor hale gelir.When some content is located in a storage account and other content is in a hosted compute instance, it becomes more challenging to deploy and update the application. Daha kolay yönetmek için ayrı dağıtımlar gerçekleştirmeniz ve uygulama ve içerik için sürüm oluşturmanız gerekebilir—bu özellikle statik içeriklerde betik dosyaları veya kullanıcı arabirimi bileşenleri bulunduğunda geçerlidir.You might have to perform separate deployments, and version the application and content to manage it more easily—especially when the static content includes script files or UI components. Ancak yalnızca statik kaynakların güncelleştirilmesi gerekiyorsa, uygulama paketini yeniden dağıtmaya gerek kalmadan depolama hesabına yüklenebilirler.However, if only static resources have to be updated, they can simply be uploaded to the storage account without needing to redeploy the application package.

  • Depolama hizmetleri özel etki alanı adlarının kullanılmasını desteklemiyor olabilir.Storage services might not support the use of custom domain names. Bu durumda kaynaklar kaynakları içeren dinamik olarak oluşturulmuş içerikten farklı bir etki alanında bulunacağından, bağlantılarda kaynakların tam URL’sini belirtmeniz gerekir.In this case it's necessary to specify the full URL of the resources in links because they'll be in a different domain from the dynamically-generated content containing the links.

  • Depolama kapsayıcılarının genel okuma erişimi için yapılandırılması gerekir ancak kullanıcıların karşıya içerik yüklemesini önlemek üzere genel yazma erişimi için yapılandırılmamış olmadığından emin olmak önemlidir.The storage containers must be configured for public read access, but it's vital to ensure that they aren't configured for public write access to prevent users being able to upload content.

  • Bir Vale anahtarı veya anonim olarak kullanılmaması kaynaklara erişimi denetlemek için belirteç kullanmayı düşünün.Consider using a valet key or token to control access to resources that shouldn't be available anonymously. Bkz: Vale anahtarı düzeni daha fazla bilgi için.See the Valet Key pattern for more information.

Bu düzenin kullanılacağı durumlarWhen to use this pattern

Bu düzen aşağıdakiler için kullanışlıdır:This pattern is useful for:

  • Bazı statik kaynaklar içeren web siteleri veya uygulamalar için barındırma maliyetlerini en aza indirme.Minimizing the hosting cost for websites and applications that contain some static resources.

  • Yalnızca statik içerik ve kaynaklardan oluşan web siteleri için barındırma maliyetlerini en aza indirme.Minimizing the hosting cost for websites that consist of only static content and resources. Barındırma sağlayıcısının depolama sistemi özelliklerine bağlı olarak, tamamen statik bir Web sitesini bir depolama hesabında barındırmak mümkün olabilir.Depending on the capabilities of the hosting provider's storage system, it might be possible to entirely host a fully static website in a storage account.

  • Diğer barındırma ortamlarında veya şirket içi sunucularda çalışan uygulamalar için statik kaynakları açığa çıkarma.Exposing static resources and content for applications running in other hosting environments or on-premises servers.

  • Depolama hesabının içeriklerini dünyanın dört bir yanından birden çok veri merkezinde önbelleğe alan bir içerik teslim ağı kullanarak içeriği birden çok coğrafi bölgede konumlandırma.Locating content in more than one geographical area using a content delivery network that caches the contents of the storage account in multiple datacenters around the world.

  • Maliyetleri ve bant genişliği kullanımını izleme.Monitoring costs and bandwidth usage. Statik içeriğin bir bölümü veya tamamı için aynı bir depolama hesabı kullanmak maliyetlerin barındırma ve çalışma zamanı maliyetlerinden daha kolay ayrılmasını sağlar.Using a separate storage account for some or all of the static content allows the costs to be more easily separated from hosting and runtime costs.

Bu düzen aşağıdaki durumlarda kullanışlı olmayabilir:This pattern might not be useful in the following situations:

  • Uygulamanın statik içeriği istemciye sunmadan önce içerik üzerinde işlem yapması gerekiyorsa.The application needs to perform some processing on the static content before delivering it to the client. Örneğin, belgeye bir zaman damgası eklemek gerekebilir.For example, it might be necessary to add a timestamp to a document.

  • Statik içerik hacmi çok küçükse.The volume of static content is very small. Bu içeriği ayrı bir depolama alanından alma yükü, içeriği işlem kaynağından ayırmanın maliyet avantajından daha fazla olabilir.The overhead of retrieving this content from separate storage can outweigh the cost benefit of separating it out from the compute resource.

ÖrnekExample

Azure depolama, doğrudan bir depolama kapsayıcısı sunma statik içerikleri destekler.Azure Storage supports serving static content directly from a storage container. Dosyaları anonim erişim istekleri aracılığıyla sunulur.Files are served through anonymous access requests. Varsayılan olarak, dosyalar alt etki alanı içinde bir URL'ye sahip core.windows.net, gibi https://contoso.z4.web.core.windows.net/image.png.By default, files have a URL in a subdomain of core.windows.net, such as https://contoso.z4.web.core.windows.net/image.png. Bir özel etki alanı adı yapılandırma ve HTTPS üzerinden dosyalara erişmek için Azure CDN'yi kullanma.You can configure a custom domain name, and use Azure CDN to access the files over HTTPS. Daha fazla bilgi için Azure Depolama'da statik Web sitesi barındırma.For more information, see Static website hosting in Azure Storage.

Bir depolama hizmetinden doğrudan uygulamanın statik bölümlerinin teslim etme

Statik Web sitesi barındırma dosyaları anonim erişim için kullanılabilir hale getirir.Static website hosting makes the files available for anonymous access. Dosyaları kimlerin erişebileceğini denetlemek gerekiyorsa, Azure blob storage'da depolamak ve ardından oluşturmak paylaşılan erişim imzaları erişimi sınırlamak için.If you need to control who can access the files, you can store files in Azure blob storage and then generate shared access signatures to limit access.

İstemciye teslim edilen sayfalardaki bağlantıları kaynağının tam URL'sini belirtmeniz gerekir.The links in the pages delivered to the client must specify the full URL of the resource. Kaynak bir paylaşılan erişim imzası gibi bir Vale anahtarı ile korunuyorsa, bu imza URL'de eklenmesi gerekir.If the resource is protected with a valet key, such as a shared access signature, this signature must be included in the URL.

Statik kaynaklar için dış depolama kullanarak gösteren örnek bir uygulama üzerinde kullanılabilir GitHub.A sample application that demonstrates using external storage for static resources is available on GitHub. Bu örnek, statik içeriği tutan kapsayıcı ve depolama hesabı belirtmek için yapılandırma dosyalarını kullanır.This sample uses configuration files to specify the storage account and container that holds the static content.

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

StaticContentHosting.Web projesinin Settings.cs dosyasındaki Settings sınıfı, bu değerleri ayıklamak ve bulut depolama hesabı kapsayıcı URL’sini içeren bir dize değeri oluşturmak için yöntemleri içerir.The Settings class in the file Settings.cs of the StaticContentHosting.Web project contains methods to extract these values and build a string value containing the cloud storage account 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 account = CloudStorageAccount.Parse(StaticContentStorageConnectionString);

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

Geçirilen URL ASP.NET kök yol karakteri () ile başlıyorsa, StaticContentUrlHtmlHelper.cs dosyası içindeki StaticContentUrlHtmlHelper sınıfı bulut depolama hesabına yolu içeren URL’yi oluşturan StaticContentUrl adlı bir yöntemi açığa çıkarır.The StaticContentUrlHtmlHelper class in the file StaticContentUrlHtmlHelper.cs exposes a method named StaticContentUrl that generates a URL containing the path to the cloud storage account if the URL passed to it starts with the ASP.NET root path character ().

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

Views\Home klasöründeki Index.cshtml dosyası src özniteliği için URL’yi oluşturmak için StaticContentUrl yöntemini kullanan bir görüntü öğesi içerir.The file Index.cshtml in the Views\Home folder contains an image element that uses the StaticContentUrl method to create the URL for its src attribute.

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