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