Skip to content

Latest commit

 

History

History
146 lines (93 loc) · 14.5 KB

Static Content Hosting pattern.md

File metadata and controls

146 lines (93 loc) · 14.5 KB

‏Static Content Hosting pattern

محتوای ثابت یا استاتیک را در یک سرویس ذخیره‌سازی مبتنی برابر مستقر کنید که با این روش می‌توان آنها را مستقیماً به کلاینت تحویل دهد. در نتیجه با این کار ممکن است نیاز به استفاده از نمونه‌ها و منابع محاسباتی گران‌قیمت را کاهش داد.

زمینه و مشکل

برنامه و applicationهای تحت وب معمولاً شامل برخی از عناصر محتوای استاتیک هستند. این محتوای ثابت یا استاتیک ممکن است شامل صفحات HTML و منابع دیگری مانند تصاویر و اسنادی باشد که در دسترس کاربر هستند به‌عنوان بخشی از یک صفحه HTML (مانند تصاویر درون‌خطی، شیوه‌نامه‌ها، و فایل‌های جاوا اسکریپت سمت سرویس‌گیرنده) و یا به‌عنوان دانلودهای جداگانه (مانند اسناد PDF) باشند.

اگرچه وب سرورها برای رندر پویا(dynamic rendering) و ذخیره خروجی(output caching) بهینه شده‌اند، اما همچنان باید درخواست‌های دانلود محتوای استاتیک را انجام دهند. این مسئله منابع پردازشی را مصرف می‌کند که اغلب می‌توان از آنها استفاده بهتری کرد.

راه‌حل

در اکثر محیط‌‌های میزبانی ابری، می‌توانید برخی از منابع یک برنامه و صفحات استاتیک را در یک سرویس ذخیره‌سازی قرار دهید. سرویس ذخیره‌سازی می‌تواند درخواست‌ها را برای این منابع ارائه کند و بار روی منابع محاسباتی که سایر درخواست‌‌های وب را مدیریت می‌کنند را کاهش دهد. هزینه ذخیره‌سازی میزبان ابری (cloud-hosted storage) معمولاً بسیار کمتر از نمونه‌‌های دیگر و حتی نمونه‌‌های محاسباتی است.

هنگام میزبانی(hosting) برخی از بخش‌‌های یک اپلیکیشن در یک سرویس ذخیره‌سازی باید ملاحظات اصلی مربوط به استقرار برنامه و ایمن‌سازی منابعی که قرار نیست برای کاربران ناشناس در دسترس باشند.

زمانی که بخش‌‌هایی از یک برنامه را در یک سرویس ذخیره‌سازی میزبانی می‌کنید، اصلی‌ترین ملاحظات مربوط به deployment برنامه و ایمن‌سازی منابعی است که قرار نیست برای کاربران ناشناس در دسترس باشند.

مسائل و ملاحظات:

*‏ هنگام تصمیم‌گیری در مورد نحوه اجرای این الگو به نکات زیر توجه کنید:

*‏ سرویس ذخیره‌سازی میزبان باید یک  HTTP endpoint را نشان دهد که کاربران می‌توانند برای دانلود منابع استاتیک به آن دسترسی داشته باشند. برخی از سرویس‌‌های ذخیره‌سازی از HTTPS نیز پشتیبانی می‌کنند، بنابراین امکان میزبانی منابع در سرویس‌‌های ذخیره‌سازی که نیاز به SSL دارند وجود دارد.

*‏ برای حداکثر کارایی (performance) برنامه و دردسترس‌بودن (availability)، استفاده از یک شبکه تحویل محتوا (content delivery network (CDN)) را برای ذخیره‌کردن محتویات قابل‌ذخیره‌سازی در مراکز داده متعدد در سراسر جهان در نظر بگیرید. بااین‌حال، احتمالاً باید برای استفاده از CDN هزینه کنید.

*‏ حساب‌‌های ذخیره‌سازی اغلب به طور پیش‌فرض برای ایجاد انعطاف‌پذیری در برابر رویدادهایی که ممکن است بر یک مرکز داده(datacenter) تأثیر بگذارد، به‌صورت جغرافیایی تکثیر(geo-replicated) می‌شوند. این بدان معنی است که آدرس IP ممکن است تغییر کند، اما URL ثابت باقی می‌ماند.

*‏ هنگامی که برخی از محتواها در یک حساب ذخیره‌سازی قرار دارند و محتوای دیگر در یک نمونه محاسباتی میزبانی شده است، استقرار و به‌روزرسانی برنامه چالش‌برانگیزتر می‌شود. ممکن است مجبور شوید پیاده‌سازی‌‌های جداگانه‌ای انجام دهید و برنامه و محتوا را برای مدیریت آسان‌تر نسخه (version) بندی کنید—مخصوصاً زمانی که محتوای استاتیک شامل فایل‌‌های اسکریپت یا مؤلفه‌‌های رابط کاربری باشد. در این صورت اگر فقط منابع استاتیک باید به‌روزرسانی شوند، می‌توان آن‌ها را به‌سادگی در حساب ذخیره‌سازی آپلود کرد، بدون اینکه نیازی به استقرار مجدد برنامه باشد.

*‏ سرویس‌‌های ذخیره‌سازی ممکن است استفاده از نام‌‌های دامنه سفارشی را پشتیبانی نکنند. در این مورد لازم است URL کامل منابع در لینک‌ها مشخص شود؛ زیرا آنها در دامنه متفاوتی از محتوای تولید شده به‌صورت پویا بوده و دارای لینک‌‌هایی منابع موردنظر هستند.

*‏ کانتینرهای ذخیره‌سازی (storage containers) باید برای دسترسی خواندن عمومی(public) پیکربندی شوند، اما مهم است که اطمینان حاصل شود که برای دسترسی به نوشتن عمومی پیکربندی نشده‌اند تا از آپلود محتوا توسط کاربران جلوگیری شود.

*‏ برای کنترل دسترسی به منابعی که نباید به‌صورت ناشناس در دسترس باشند، از یک کلید یا توکن valet استفاده کنید. برای اطلاعات بیشتر الگوی Valet Key را ببینید.

چه زمانی از این الگو استفاده کنیم؟

این الگو برای موارد زیر مفید است:

*‏ به‌حداقل‌رساندن هزینه میزبانی وب‌سایت‌ها و برنامه‌هایی که حاوی برخی منابع استاتیک هستند.

*‏ به‌حداقل‌رساندن هزینه میزبانی وبگاه‌هایی که فقط از محتوا و منابع استاتیک تشکیل شده‌اند. بسته به قابلیت‌‌های سیستم ذخیره‌سازی ارائه‌دهنده میزبانی، ممکن است امکان میزبانی کامل یک وب‌سایت کاملاً استاتیک در یک حساب ذخیره‌سازی (storage account) وجود داشته باشد.

*‏ آشکارسازی (Exposing) منابع و محتوای استاتیک برای برنامه‌‌های که در محیط‌‌های میزبانی دیگر یا سرورهای داخلی (on-premises servers) در حال اجرا هستند.

*‏ قراردادن محتوا در بیش از یک منطقه جغرافیایی با استفاده از یک شبکه توزیع محتوا (CDN) که محتویات حساب ذخیره‌سازی را در چندین مرکز داده (datacenter) در سراسر جهان ذخیره می‌کند.

*‏ نظارت بر هزینه‌ها و مصرف پهنای باند. استفاده از یک حساب ذخیره‌سازی جداگانه برای بخش‌‌هایی یا تمامی محتوای استاتیک اجازه می‌دهد تا هزینه‌ها را به‌راحتی از هزینه‌‌های میزبانی و زمان اجرا جدا کرد.

این الگو ممکن است در شرایط زیر مفید نباشد:

*‏ برنامه نیاز دارد قبل از ارسال محتوای استاتیک به کاربر، برخی فرایندهای پردازشی را روی آن انجام دهد. به‌عنوان‌مثال، ممکن است لازم باشد یک ثبت زمانی (timestamp) به یک سند اضافه شود.

*‏ در حالتی که حجم محتوای استاتیک بسیار کم باشد. هزینه سربار بازیابی این محتوا از فضای ذخیره‌سازی جداگانه می‌تواند بیشتر از هزینه جداسازی آن از منبع محاسباتی باشد.

مثال

‏ Azure Storage از ارائه محتوای استاتیک مستقیماً از یک کانتینر ذخیره‌سازی پشتیبانی می‌کند و فایل‌ها از طریق درخواست‌‌های دسترسی ناشناس ارائه می‌شوند. به طور پیش‌فرض، فایل‌ها یک URL در زیر دامنه  core.windows.net مانند https://contoso.z4.web.core.windows.net/image.png دارند. می‌توانید یک نام دامنه سفارشی را پیکربندی کنید و از Azure CDN برای دسترسی به فایل‌ها از طریق HTTPS استفاده کنید. برای اطلاعات بیشتر،  Static website hosting in Azure Storage را ببینید.

static-content-hosting-pattern

وب‌سایت استاتیک معمولاً فایل‌ها را برای کاربران ناشناس در دسترس قرار می‌دهد. اگر می‌خواهید کنترل کنید چه کسی می‌تواند به فایل‌ها دسترسی داشته باشد، می‌توانید فایل‌ها را در حافظه Azure blob ذخیره کنید و سپس برای محدودکردن دسترسی، امضاهای دسترسی مشترک (shared access signatures) را ایجاد کنید.

پیوندها یا لینک‌‌های موجود در صفحاتی که به کاربرها تحویل داده می‌شوند باید URL کامل منبع را مشخص کنند. اگر منبع با یک کلید Valet محافظت می‌شود، مانند امضای دسترسی مشترک(shared access signature)، این امضا باید در URL گنجانده شود.

یک برنامه که استفاده از حافظه خارجی برای منابع استاتیک را نشان می‌دهد در  GitHub موجود است. این مثال از فایل‌های پیکربندی برای تعیین حساب ذخیره‌سازی و محفظه‌ای که محتوای استاتیک را در خود نگه می‌دارد، استفاده می‌کند.

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

کلاس  Settings در فایل Settings.cs پروژه StaticContentHosting.Web حاوی روش‌هایی برای استخراج این مقادیر و ساخت یک مقدار رشته‌ای حاوی 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 در فایل StaticContentUrlHtmlHelper.cs روشی به نام StaticContentUrl را نشان می‌دهد که اگر URL ارسال شده به آن با کاراکتر مسیر ریشه ASP.NET شروع شود، URL حاوی مسیر حساب ذخیره‌سازی ابری ایجاد می‌کند.

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

فایل Index.cshtml در پوشه Views\Home حاوی یک image است که از روش  StaticContentUrl برای ایجاد URL برای گزینه  src خود استفاده می‌کند.

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

قدم بعدی

لینک Static Content Hosting sample یک مثال از برنامه‌ای جهت پیاده‌سازی این الگو را نشان می‌دهد.

منابع مرتبط

الگوی Valet Key. اگر قرار نیست منابع موردنظر برای کاربران ناشناس در دسترس باشد، از این الگو برای محدودکردن دسترسی مستقیم استفاده کنید.

Serverless web application on Azure. یک معماری مرجع که از میزبانی وب‌سایت استاتیک با توابع Azure برای پیاده‌سازی یک برنامه وب بدون سرور استفاده می‌کند.