ETag負(fù)載均衡的相關(guān)問(wèn)題
一般的網(wǎng)站我們都會(huì)使用服務(wù)器負(fù)載均衡環(huán)境來(lái)支撐我們的業(yè)務(wù),那么,在這個(gè)環(huán)境下,ETag的相關(guān)問(wèn)題我們就需要單獨(dú)來(lái)討論一下了。那么,具體的內(nèi)容還是讓我們從文章中來(lái)了解一下吧。
在負(fù)載均衡環(huán)境中(LVS, LoadBalance)為了減少瀏覽器數(shù)據(jù)的重復(fù)請(qǐng)求操作,一般需要設(shè)置 Http Header 的 Etage 和 Expires 告訴瀏覽器請(qǐng)求數(shù)據(jù)是否已過(guò)期。以下內(nèi)容主要考慮Apache+squid 環(huán)境
ETag Header是文件修改時(shí)間、文件大小和inode號(hào)生成的校驗(yàn)(checksum),在多臺(tái)服務(wù)器的負(fù)載均衡環(huán)境下會(huì)因部署內(nèi)容的inode節(jié)點(diǎn)差異造成 ETag 的不同,在多臺(tái)WEB前端做負(fù)載均衡的情況下,會(huì)因?yàn)檎?qǐng)求同一個(gè)數(shù)據(jù)但不同機(jī)器的 ETag 而影響了響應(yīng). 具體表現(xiàn)為用戶在第一次請(qǐng)求某一內(nèi)容時(shí)下載而再次時(shí)瀏覽器會(huì)發(fā)現(xiàn)ETag不同而再次請(qǐng)求下載.。(再次刷新時(shí)查看是否響應(yīng)碼為:304)
對(duì)于這種負(fù)載均衡情況下,Apache可以使用 File Etag 選項(xiàng)配置
Apache的默認(rèn)ETag的值總是由文件的索引節(jié)點(diǎn)(Inode)、大小(Size)、最后修改時(shí)間(MTime)決定
這里我們只需要去掉Inode即可
FileETag MTime Size
具體關(guān)于 FileETag 詳細(xì)內(nèi)容可以查看Apache官方文檔。
Expires用于控制請(qǐng)求文件的有效時(shí)間,當(dāng)請(qǐng)求數(shù)據(jù)在有效期內(nèi)時(shí)客戶端瀏覽器從緩存請(qǐng)求數(shù)據(jù)而不是服務(wù)器端. 當(dāng)緩存中數(shù)據(jù)失效或過(guò)期,才決定從服務(wù)器更新數(shù)據(jù)。
可以使用Apache的mod_expires 模塊來(lái)設(shè)置,這包括控制應(yīng)答時(shí)的Expires頭內(nèi)容和Cache-Control頭的max-age指令
- ExpiresActive On
- ExpiresByType image/gif "access plus 1 month"
- ExpiresByType image/jpeg "access plus 1 month"
- ExpiresByType image/x-icon "access plus 1 month"
- ExpiresByType image/png "access plus 1 month"
- ExpiresByType text/html "access plus 30 minutes"
- ExpiresByType text/css "access plus 30 minutes"
- ExpiresByType text/js "access plus 30 minutes"
- ExpiresByType application/x-javascript "access plus 30 minutes"
- ExpiresByType application/x-shockwave-flash "access plus 30 minutes"
這個(gè)負(fù)載均衡環(huán)境下的以上設(shè)置為圖片文件的有效期為從請(qǐng)求文件開(kāi)始1個(gè)月,html,css,js,flash文件的有效期為從請(qǐng)求文件開(kāi)始30分鐘,這里只是一個(gè)常規(guī)設(shè)置,Apache官方文檔 對(duì)此設(shè)置有詳細(xì)介紹。當(dāng)設(shè)置了expires后,會(huì)自動(dòng)輸出Cache-Control 的max-age 信息,這個(gè)數(shù)值是expires有效期內(nèi)的秒數(shù),(一個(gè)月的數(shù)值為2592000) 在這個(gè)時(shí)間段里,該文件的請(qǐng)求都將直接通過(guò)緩存服務(wù)器獲取,當(dāng)然如果需要忽略瀏覽器的刷新請(qǐng)求(F5),緩存服務(wù)器squid還需要使用 refresh_pattern 選項(xiàng)來(lái)忽略該請(qǐng)求refresh_pattern -i .jpg 1440 50% 10080 reload-into-ims ignore-reload ignore-no-cache ignore-private
以下為實(shí)際輸出的HTTP Header信息
- Date Thu, 07 Aug 2008 07:27:57 GMT
- Server Apache
- Last-Modified Fri, 27 Jun 2008 07:18:52 GMT
- Etag "df6-b8c8cf00"
- Accept-Ranges bytes
- Content-Length 3574
- Cache-Control max-age=2592000
- Expires Sat, 06 Sep 2008 07:27:57 GMT
- Content-Type image/jpeg
- Age 34241
- X-Cache HIT from s1.ihompy.com
- Connection keep-alive
在負(fù)載均衡環(huán)境下,對(duì)于動(dòng)態(tài)頁(yè)面的緩存如果不是頻繁更新的頁(yè)面數(shù)據(jù),可以在squid緩存,只需要注意兩點(diǎn)
1. session : 對(duì)于需要緩存的數(shù)據(jù),一定要關(guān)閉session防止在http header 中包括session id 字段
2. Last-Modified 和 Expires 標(biāo)記:一般般純靜態(tài)頁(yè)面本身都會(huì)有Last-Modified信息,這是由WEB服務(wù)器獲取文件的最后修改時(shí)間生成的,而動(dòng)態(tài)頁(yè)面需要默認(rèn)的輸出內(nèi)容是
- Date Thu, 07 Aug 2008 16:58:37 GMT
- Expires Thu, 19 Nov 1981 08:52:00 GMT
- Last-Modified Thu, 07 Aug 2008 16:58:37 GMT
這里的 Last-Modified 時(shí)間和請(qǐng)求文件的時(shí)間相同,也就是說(shuō)該文件總是聲明為最新的,在程序中需要輸出Last-Modifed 和 Expires信息,比如php
- header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . ' GMT');
- header('Expires: ' . gmdate ("D, d M Y H:i:s", time() + 3600*24). " GMT");
以上信息設(shè)置php文件的過(guò)期時(shí)間為請(qǐng)求該文件的時(shí)間后的24小時(shí)(3600*24)