وضعیت سرورها

وبــلاگ

وضعیت سرورها
  • ETAGs و Expiry Headers چیست؟

    علیرضا نصری دوشنبه ۳۰ شهریور ۱۳۹۴ آموزش , مقالات

    در عصر حاضر، سرعت، یکی از مهمترین فاکتورهای یک فرآیند می باشد، به عبارت دیگر در صورتی که یک فرآیند از سرعت بیشتر و پایداری بهتری نسبت به بقیه برخوردار باشد، به عنوان یک اصل و مرجع شناخته می شود و الگو پذیر می باشد.

    این امر در حوزه فناوری اطلاعات به خصوص در world wide web به خوبی صادق است، یکی از مهمترین و می توان گفت که بزرگترین پارامترها در رتبه دهی وبسایت، سرعت باز شدن صفحات آن می باشد.

    به عنوان مثال اگر سرعت بازشدن وبسایت بیش از ۱۰ ثانیه باشد، ممکن است شما از بازدید این وبسایت صرف نظر کرده و به وبسایت دیگری رجوع کنید. از اینرو بهبود و افزایش سرعت یک وبسایت نه تنها برای حفظ کاربران و بازدیدکنندگان حیاتی است، بلکه این امر می تواند در صرفه جوی مقدار زیادی از پهنای باند کمک نماید.

    همچنین زمان بارگذاری وب سایت، رابطه مستقیمی با پایداری سرور دارد، چه بسا زمان زیاد باعث خاموش شدن و به اصطلاح دان تایم می شود.

    زمانی که بحث سرعت یک وبسایت و یا وب سرور پیشرو است، ETAGS و Expiry headers  دو فاکتور اصلی بشمار می آیند که نیاز به بررسی دارند. ETAGS , Expiry headers برای شناسایی محتوا توسط سیستم کاربران (مرورگر) به منظور دریافت و به روز رسانی آخرین فایل های موجود روی وبسایت می باشد. اما این دو فاکتور تفاوت های دارند که در زیر به آنها می پردازیم.

    ETAGs چیست؟

    ETAGs مخفف Entity Tags می باشد به عبارتی Etag  یک فایل هدر (سرامد) می باشد که در نسخه HTTP.1.1 معرفی شده است. ETAGs ها شباهت زیادی به validators ها ( اعتبار سنج ها ) دارند، که آنها هیچ اطلاعاتی در مورد اینکه کاربر بتواند تعیین کند که چه اطلاعاتی به روز شوند و یا درخواستی دوباره برای یک فایل ایجاد نماید.

    ETAG شبیه یک checksum می باشد، که بعد از تغییر محتوای یک فایل، آن نیز تغییر می کند. زمانی که کاربر درخواست یک فایل را می دهد، مرورگر کاربر به سمت سرور هدایت داده خواهد شد و به ETAG یک فایل در سرور، درخواست بررسی می دهد ایا این فایل در کش کاربر موجود می باشد یا خیر، سپس سرور، ETAG ارسالی را بررسی می کند که این ETAG با ETAG موجود روی سرور یکی هست یا تفاوت دارد. اگر ETAG یکسان بود، سرور وضعیتHTTP 304 را به عنوان پاسخ به مرورگر کاربر ارسال می کند که به معنی تغییر داده نشده است، که بیان میکند کاربر میتواند از فایل کش شده در سیستم خود استفاده نماید. از طرف دیگر اگرETAG ارسال شده توسط کاربر با ETAG موجود روی سرور متفاوت باشد، سرور وضعیت HTTP 200 را به عنوان پاسخ به این درخواست بازمی گرداند و آخرین فایل موجود را به کاربر ارسال می کند. در واقع کاربر آخرین فایل را بارگذاری می کند.

    Expiry Headers چیست؟

    Expiry Headers زمانی استفاده می شود که شما نمی خواهید کاربران برای هر بررسی فایل و بروزرسانی آنها یک درخواست به سمت سرور ارسال کنند، به عبارتی در ETAG کاربر برای به روز رسانی ها با سرور ارتباط برقرار می کند و برای هر فایل و محتوا، درخواستی ارسال می نماید، اما در Expiry headers سرور زمان انقضای اطلاعات یک فایل را میداند و در بازه ای که زمان آن منقضی شده است برای بروزرسانی فایل های کش شده در سیستم کاربر اقدام میکند، به همین دلیل پروکسی/کش بار زیادی برای هر بار چک کردن بروزرسانی ها روی سرور ایجاد نخواهد کرد.

    در ادامه به نحوه بکارگیری این دو پارامتر و مکانیزم عملکرد آنها می پردازیم.

    گرچه راه های زیادی برای بهبود (Optimize) کردن سرعت یک سایت مثل استفاده از ترکیب کدهای جاوا اسکریپت و کاهش حجم عکس های موجود است، اما خیلی از راه های موجود همانند بکارگیری ETAGS و Expiry Header آسان نمی باشند.

    نحوه عملکرد ETags

    سرور منشا تعیین کننده بسته های ETag در هنگام پاسخ به کاربر می باشد که یکی از دو حالت زیر می باشد.

    • کاربر برای اولین بار درخواست فایل ثابتی مانند ( folder/file.gif ) به سرور می دهد. متن زیر هدری فایلی است که کاربر از سمت سرور دریافت می کند:

     

    همانطور که مشاهده می شود ETag مربوط به این فایل ۱۰c24bc-4ab-457e1c1f می باشد، که در سیستم کاربر ذخیره می شود.

    • در درخواست های بعدی، زمانی که کاربر همان فایل را از سمت سرور درخواست می کند، مرورگر باید این بسته را بررسی نماید در این حالت از If-None-Match Header برای تشخیصی تغییر محتوای فایل در سرور استفاده می شود، بدین منظور که این هدر توسط سرور بررسی می شود اگر ETAG موجود در هدر با ETAG موجود در سرور یکسان بود، سرور در پاسخ کد ۳۰۴ را به عنوان عدم تغییر محتوا ارسال می کند و همان فایل موجود در کش سیستم کاربر فراخوانی می شود.

     

    برای اطلاع از وضیعت کدهای وب سرور apache می توانید این مقاله را مطالعه نمایید.

    تاکنون به مفاهیم و فواید این مکانیزم پرداخته ایم، حال نیاز هست که معایب این سیستم نیز مورد بررسی قرار گیرد.

    مشکلی که در بکار گیری Etag هست این است که آنها با استفاده از پارمترهایی تولید می شوند که توسط سرور یکتا و منحصر به فرد می باشند. به طور پیشفرض وب سرور Apache یک ETag را با استفاده از ترکیبی از شماره inode فایل، آخرین زمان تغییر، زمان ایجاد فایل و … تولید می کند. بدین صورت ETAG های دو فایل در صورتی که فایل ها یکسان باشند شماره inode یکسانی نخواهند داشت و متفاوت خواهند بود.

    بنابراین این موضوع زمانی باعث ایجاد مشکل و اختلال می شود که شما دارای کلاستری از وب سرور (سوریس های لود بالانسینگ) برای ارائه یک محتوا داشته باشید. زمانی که یک فایل از سرور اول ارائه می شود و بعد همان فایل توسط سرور دوم اعتبار سنجی می شود، Etag یکسانی در سرور نسبت به فایل قبلی نخواهد داشت بنابراین فایل دوباره توسط مرورگر کاربر از سمت سرور دوم فراخوانی می شود و این به معنای این است که هنگامی که کلاستری از وب سرور دارید، استفاده از ETags بی فایده می باشد.

    به صورت پیشفرض Etag روی وب سرور فعال می باشد، شما می توانید این قابلیت را توسط قرار دادن کد های زیر در فایل کانفیگ وب سرور و یا htaccess غیر فعال کنید.

     

    در صورتی که وب سرور شما Lighthttpd باشد نیاز هست که کد زیر را در فایل کانفیگ این وب سرور قرار دهید.

     

    در صورتی که وب سرور شما IIS می باشد، لطفا این مقاله را مطالعه نمایید.

    نحوه پیاده سازی Expiry headers:

     

    ممکن است بخواهید که برای برخی از فایل ها زمانی به عنوان انقضای کش قرار دهید، این موارد در فایل htaccess قرار خواهد گرفت.

     

    همانطور که مشاهده می کنید، بخش های مختلفی به همراه زمان های مختلفی در این فایل قرار داده شده است.

    تنظیم زمان انقضا به صورت ماهانه یا بیشتر، هنگامی که به موضوع فکر می کنیم عملی و منطقی نمی باشد. زیرا ممکن است در این بازه محتوای اطلاعات روی سرور تغییر داده شود، اما کاربران همان محتوای قبلی را بارگذاری نمایند. همچنین تعیین زمان در حدود ۳۰ دقیقه باعث رفرش شدن محتوای وبسایت و افزایش لود سایت می شود که این امر نیز صحیح نمی باشد.

    در کدهای بالا، چند بخش وجود دارد در خط اول، شما می توانید نوع فایل ها را به همراه طول (حجم) آنها مشخص نمایید.

    در خط دوم پارامتر max-age برای تعیین زمان انقضا می باشد که تا این مدت فایل از کش بارگذاری شود.

    و در انتها، خط سوم به عنوان مشخصات فنی برای Expires headers می باشد، بدین منظور که شما مدت زمانی را تا هنگامی که بخش مورد نظر منقضی نشده است تعیین می کنید.

    access plus [length of time] به این معنی است که تاریخ فایل مورد نظر از زمان آخرین درخواست به آن منقضی خواهد شد. مدت زمان access plus [length of time] می بایست با مدت تعریف شده Cache-Control یکی باشد.

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

    سوالات متداول:

    • آیا این امکان وجود دارد که از ETAGS وExpiry headers به طور همزمان استفاده کنیم؟

    بله این امکان وجود دارد که از هر دو در یک زمان استفاده نمایید. زمانی که از Expiry header استفاده می کنید، تاریخ انقضای آنرا با دلیل و منطقی با توجه به زمان های ثابتی که محتوا تغییر می کنند، تنظیم نمایید. زمانی که از ETAGS از سمت کاربر به سرور ارسال می شود، زودتر می توان تشخیص دهد که چه اطلاعاتی تغییر کرده و نیاز به بروزرسانی می باشد، به طور کلی ترکیب هر دو مفید می باشد.

    • ETAGS چگونه تولید می شود؟

    همانطور که در متن بالا توضیح داده شد، ETAGs به صورت پیشفرض توسط Apache بر پایه ترکیبی از، شماره Inode ، زمان آخرین تغییر، سایز فایل و … تولید می شود.

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

    این مورد نیز در متن بالا توضیح داده شده است، هنگامی که شما از چند سرور به عنوان وب سرور برای لود بالانسینگ استفاده می نمایید، به دلیل اینکه الگوریتم تولیدی Etags با استفاده از شماره Inode فایل تولید می شود، شما می توانید در پیکربندی Apache استفاده نکردن از شماره Inode به عنوان الگوریتم تولیدی را غیر فعال کنید اما باید مراقب باشید که تایم زون سرور ها یکی باشند، به طوری کلی استفاده از این تکنیک در لود بالانسینگ پیشنهاد نمی شود.

    • این امکان وجود دارد که از ETAGs برای کش کردن تمامی محتوای وبسایت استفاده کنیم؟

    برای محتوای ثابت، بهتر است که از expiry headers و از پارامتر Cache-Control: max-age باطول زمان زیادی استفاده شود در این حالت مرورگر در بازدید های معمولی درخواستی ارسال نخواهد کرد. بنابراین در محتوای ثابت ETAGs کاربردی نخواهد داشت.

    • چه هنگام نیاز هست که ازExpiry Headers و یاETAGs استفاده کرد؟

    هنگامی که شما نمی توانید زمان تغییر محتوای موجود را پیش بینی نمایید، لازم است که از ETAGs استفاده کنید تا نیاز نباشد که هر چند وقت اطلاعات را بروز نمایید.

    0

    برچسب ها :

با عضویت در خبرنامه شما را از آخرین تجربیات مان و مطالب تخصصی آگاه خواهیم کرد.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *