ETag負(fù)載均衡的相關(guān)問題
一般的網(wǎng)站我們都會使用服務(wù)器負(fù)載均衡環(huán)境來支撐我們的業(yè)務(wù),那么,在這個環(huán)境下,ETag的相關(guān)問題我們就需要單獨來討論一下了。那么,具體的內(nèi)容還是讓我們從文章中來了解一下吧。
在負(fù)載均衡環(huán)境中(LVS, LoadBalance)為了減少瀏覽器數(shù)據(jù)的重復(fù)請求操作,一般需要設(shè)置 Http Header 的 Etage 和 Expires 告訴瀏覽器請求數(shù)據(jù)是否已過期。以下內(nèi)容主要考慮Apache+squid 環(huán)境
ETag Header是文件修改時間、文件大小和inode號生成的校驗(checksum),在多臺服務(wù)器的負(fù)載均衡環(huán)境下會因部署內(nèi)容的inode節(jié)點差異造成 ETag 的不同,在多臺WEB前端做負(fù)載均衡的情況下,會因為請求同一個數(shù)據(jù)但不同機器的 ETag 而影響了響應(yīng). 具體表現(xiàn)為用戶在第一次請求某一內(nèi)容時下載而再次時瀏覽器會發(fā)現(xiàn)ETag不同而再次請求下載.。(再次刷新時查看是否響應(yīng)碼為:304)
對于這種負(fù)載均衡情況下,Apache可以使用 File Etag 選項配置
Apache的默認(rèn)ETag的值總是由文件的索引節(jié)點(Inode)、大小(Size)、最后修改時間(MTime)決定
這里我們只需要去掉Inode即可
FileETag MTime Size
具體關(guān)于 FileETag 詳細(xì)內(nèi)容可以查看Apache官方文檔。
Expires用于控制請求文件的有效時間,當(dāng)請求數(shù)據(jù)在有效期內(nèi)時客戶端瀏覽器從緩存請求數(shù)據(jù)而不是服務(wù)器端. 當(dāng)緩存中數(shù)據(jù)失效或過期,才決定從服務(wù)器更新數(shù)據(jù)。
可以使用Apache的mod_expires 模塊來設(shè)置,這包括控制應(yīng)答時的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"
這個負(fù)載均衡環(huán)境下的以上設(shè)置為圖片文件的有效期為從請求文件開始1個月,html,css,js,flash文件的有效期為從請求文件開始30分鐘,這里只是一個常規(guī)設(shè)置,Apache官方文檔 對此設(shè)置有詳細(xì)介紹。當(dāng)設(shè)置了expires后,會自動輸出Cache-Control 的max-age 信息,這個數(shù)值是expires有效期內(nèi)的秒數(shù),(一個月的數(shù)值為2592000) 在這個時間段里,該文件的請求都將直接通過緩存服務(wù)器獲取,當(dāng)然如果需要忽略瀏覽器的刷新請求(F5),緩存服務(wù)器squid還需要使用 refresh_pattern 選項來忽略該請求refresh_pattern -i .jpg 1440 50% 10080 reload-into-ims ignore-reload ignore-no-cache ignore-private
以下為實際輸出的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)境下,對于動態(tài)頁面的緩存如果不是頻繁更新的頁面數(shù)據(jù),可以在squid緩存,只需要注意兩點
1. session : 對于需要緩存的數(shù)據(jù),一定要關(guān)閉session防止在http header 中包括session id 字段
2. Last-Modified 和 Expires 標(biāo)記:一般般純靜態(tài)頁面本身都會有Last-Modified信息,這是由WEB服務(wù)器獲取文件的最后修改時間生成的,而動態(tài)頁面需要默認(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 時間和請求文件的時間相同,也就是說該文件總是聲明為最新的,在程序中需要輸出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文件的過期時間為請求該文件的時間后的24小時(3600*24)


















