آشنایی با 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 ) به سرور می دهد. متن زیر هدری فایلی است که کاربر از سمت سرور دریافت می کند:

HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: "10c24bc-4ab-457e1c1f"
Content-Length: 12195
1
2
3
4
HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: "10c24bc-4ab-457e1c1f"
Content-Length: 12195

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

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

GET /a/test.gif HTTP/1.1
Host: www.geekride.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: "10c24bc-4ab-457e1c1f"
HTTP/1.1 304 Not Modified
1
2
3
4
5
GET /a/test.gif HTTP/1.1
Host: www.geekride.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: "10c24bc-4ab-457e1c1f"
HTTP/1.1 304 Not Modified

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

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

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

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


Header unset
ETagFileETag none
1
2
3
Header unset

ETagFileETag none

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


static-file.etags = 'disable'
1
static-file.etags = 'disable'

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

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


01.# 1 YEAR
02.<FilesMatch "\.(ico|pdf|flv)$">
03.Header set Cache-Control "max-age=29030400, public"
04.ExpiresDefault "access plus 1 years"
05.</FilesMatch>
06.# 2 MONTHS
07.<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
08.Header set Cache-Control "max-age=4838400, public"
09.ExpiresDefault "access plus 2 months"
10.</FilesMatch>
11.# 1 WEEK
12.<FilesMatch "\.(xml|txt|css|js)$">
13.Header set Cache-Control "max-age=604800, public"
14.ExpiresDefault "access plus 1 weeks"
15.</FilesMatch>
16.# 30 MIN
17.<FilesMatch "\.(html|htm|php)$">
18.Header set Cache-Control "max-age=1800, private, proxy-revalidate"
19.ExpiresDefault "access plus 30 minutes"
20.</FilesMatch>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
01.# 1 YEAR

02.<FilesMatch "\.(ico|pdf|flv)$">

03.Header set Cache-Control "max-age=29030400, public"

04.ExpiresDefault "access plus 1 years"

05.</FilesMatch>

06.# 2 MONTHS

07.<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">

08.Header set Cache-Control "max-age=4838400, public"

09.ExpiresDefault "access plus 2 months"

10.</FilesMatch>

11.# 1 WEEK

12.<FilesMatch "\.(xml|txt|css|js)$">

13.Header set Cache-Control "max-age=604800, public"

14.ExpiresDefault "access plus 1 weeks"

15.</FilesMatch>

16.# 30 MIN

17.<FilesMatch "\.(html|htm|php)$">

18.Header set Cache-Control "max-age=1800, private, proxy-revalidate"

19.ExpiresDefault "access plus 30 minutes"

20.</FilesMatch>

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

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

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

در خط دوم پارامتر 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 استفاده کنید تا نیاز نباشد که هر چند وقت اطلاعات را بروز نمایید.

خواندن 607 دفعه

آدرس : تهران ، میدان انقلاب ، کوچه رشتچی ، پلاک ۱۴ (ساختمان ایرانیان) ،طبقه دوم واحد ۸

 

خط ویژه: ۶۶۹۲۸۷۸۷-۰۲۱

تلفن : ۶۶۹۲۸۰۴۰-۰۲۱ | ۶۶۱۲۴۱۴۹-۰۲۱ | تلفن همراه : ۰۹۱۲۳۷۹۰۵۸۸

فکس دیجیتال: ۸۹۸۷۷۳۷۳-۰۲۱

آدرس ایمیل : wnegaran[at]gmail.com 

تمامی حقوق مادی و معنوی این سایت متعلق به شرکت وب نگاران پارسه می باشد