編輯

共用方式為


靜態內容託管模式

Azure 儲存體

將靜態內容部署至雲端式儲存體服務,以將其直接傳遞至用戶端。 這可減少潛在昂貴計算執行個體的需求。

內容和問題

Web 應用程式通常包含靜態內容的一些元素。 此靜態內容可能包含 HTML 頁面和其他資源,例如可供用戶端使用的影像和文件,可以是 HTML 頁面的一部分 (例如內嵌影像、樣式表和用戶端 JavaScript 檔案) 或個別下載內容 (例如 PDF 文件)。

雖然網頁伺服器已針對動態轉譯和輸出快取進行最佳化,但仍必須處理下載靜態內容的要求。 這會耗用通常有更佳用途的處理週期。

解決方案

在大部分的雲端託管環境中,您可以將一些應用程式的資源和靜態頁面放在儲存體服務中。 儲存體服務可以提供這些資源的要求,減少處理其他 Web 要求的計算資源負載。 雲端託管儲存體的成本通常遠低於計算執行個體。

在儲存體服務中託管應用程式的某些部分時,主要考量是與部署應用程式以及保護不適用於匿名使用者的資源有關。

問題和考量

當您決定如何實作此模式時,請考慮下列幾點:

  • 託管的儲存體服務必須公開 HTTP 端點,使用者才能存取以下載靜態資源。 某些儲存體服務也支援 HTTPS,因此可以在需要 SSL 的儲存體服務中託管資源。

  • 為了達到最大效能和可用性,請考慮使用內容傳遞網路 (CDN) 來快取全球多個資料中心的儲存體容器內容。 不過,您可能需要支付使用 CDN 的費用。

  • 儲存體帳戶通常會依預設進行異地複寫,以針對可能影響資料中心的事件提供復原能力。 這表示 IP 位址可能會變更,但 URL 會維持不變。

  • 當某些內容位於儲存體帳戶中,而其他內容位於託管的計算執行個體中時,部署和更新應用程式會變得更具挑戰性。 您可能必須執行個別的部署,並設定應用程式和內容的版本,以便更輕鬆地管理它,特別是當靜態內容包含指令碼檔案或 UI 元件時。 不過,如果只需要更新靜態資源,就可直接將其上傳至儲存體帳戶,而不需要重新部署應用程式封裝。

  • 儲存體服務可能不支援使用自訂網域名稱。 在此案例中,您必須在連結中指定資源的完整 URL,因為它們會與包含連結的動態產生內容分別位於不同的網域中。

  • 儲存體容器必須設定為公用讀取權限,但請務必確保它們未設定為公用寫入權限,以防止使用者上傳內容。

  • 請考慮使用限時金鑰或權杖來控制不應該提供匿名使用的資源存取權。 如需詳細資訊,請參閱限時金鑰模式

使用此模式的時機

此模式可用於:

  • 將包含一些靜態資源之網站和應用程式的託管成本降至最低。

  • 將只包含靜態內容和資源的網站託管成本降至最低。 根據託管提供者儲存體系統的功能,可能會完全託管儲存體帳戶中的完整靜態網站。

  • 針對在其他託管環境或內部部署伺服器中執行的應用程式公開靜態資源和內容。

  • 使用內容傳遞網路,在多個地理區域中尋找內容,以快取世界各地多個資料中心的儲存體帳戶內容。

  • 監測成本和頻寬使用量。 針對部分或所有靜態內容使用不同的儲存體帳戶,可易於區分託管和運行時間的成本。

此模式可能無法用於下列情況:

  • 應用程式必須先對靜態內容執行一些處理,才能將它傳遞給用戶端。 例如,可能需要將時間戳記新增至文件。

  • 靜態內容的磁碟區非常小。 從個別儲存體擷取此內容的負擔,可能超過將其與計算資源分開的成本優勢。

工作負載設計

架構設計人員應該評估靜態內容託管模式如何用於其工作負載的設計,以解決 Azure Well-Architected 架構支柱涵蓋的目標和原則。 例如:

要素 此模式如何支援支柱目標
成本最佳化著重於維持和改善工作負載的投資報酬率 動態應用程式託管通常比靜態託管更昂貴,因為動態託管可以執行您的編碼商務規則。 使用應用程式平台傳遞靜態內容並不符合成本效益。

- CO:09 流程成本
- CO:10 資料成本
效能效率可透過調整規模、資料、程式碼達到最佳化,有效率地協助您的工作負載符合需求 卸除外部化託管的責任有助於減輕壅塞,並讓您只將應用程式平台用來傳遞商務規則。

- PE:07 撰寫基礎結構的程式碼

如同任何設計決策,請考慮對其他可能以此模式導入之目標的任何取捨。

範例

Azure 儲存體支援直接從儲存體容器提供靜態內容。 檔案是透過匿名存取要求來提供。 根據預設,檔案的 core.windows.net 子網域有 URL,例如 https://contoso.z4.web.core.windows.net/image.png。 您可以設定自訂網域名稱,並使用 Azure CDN 透過 HTTPS 存取檔案。 如需詳細資訊,請參閱Azure 儲存體中的靜態網站代管

直接從儲存體服務傳遞應用程式的靜態部分

靜態網站託管讓檔案可供匿名存取。 如果您需要控制誰可以存取檔案,您可以將檔案儲存在 Azure Blob 儲存體中,然後產生時間和範圍有限的共用存取簽章來限制存取。 產生的存取簽章應該使用 Microsoft Entra 使用者受委派的權杖,而且只能短暫存在。

傳遞至用戶端之頁面的連結必須指定資源的完整 URL。 如果資源受到限時金鑰的保護,例如共用存取簽章,則必須將此簽章包含在 URL 中。

示範在 GitHub 上將外部記憶體用於靜態資源的範例應用程式。 此範例會使用組態檔來指定保存公用靜態內容的儲存體帳戶 URL 和容器。

如果傳遞至雲端儲存體帳戶的 URL 開頭為 ASP.NET 根路徑字元 (~),檔案 StaticContentUrlHtmlHelper.cs 中的 StaticContentUrlHtmlHelper 類別會公開名為 StaticContentUrl 的方法。

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 資料夾中的 Index.cshtml 檔案包含影像元素,其會使用 StaticContentUrl 方法來為其 src 屬性建立 URL。

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

下一步