负载均衡环境中和如何设置Expires和Etag
在負載均衡環境中(LVS, LoadBalance)為了減少瀏覽器數據的重復請求操作,一般需要設置 Http Header 的 Etage 和 Expires 告訴瀏覽器請求數據是否已過期。以下內容主要考慮Apache+squid 環境
ETag Header是文件修改時間、文件大小和inode號生成的校驗(checksum),在多臺服務器的負載均衡環境下會因部署內容的inode節點差異造成 ETag 的不同,在多臺WEB前端做負載均衡的情況下,會因為請求同一個數據但不同機器的 ETag 而影響了響應. 具體表現為用戶在第一次請求某一內容時下載而再次時瀏覽器會發現ETag不同而再次請求下載.。(再次刷新時查看是否響應碼為:304)
對于Apache 可以使用 FileEtag 選項配置
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)
Squid和Apache中的max-age與Expires的分別
主要重點在于我們要明白一個相對(Expires)一個絕對(max-age).
分別
max-age
max-age是HTTP/1.1中,他是指我們的web中的文件被用戶訪問(請求)后的存活時間,是個相對的值,相對Request_time(請求時間).
例如:A.html 用戶請求時間是18:00,max-age設置的是600的話,相當18:00+600秒過期,也就是相對18:00的時間后面600秒后過期.默認的max-age是由Expires算出來的.
Expires
Expires是HTTP/1.0中的,它比max-age要麻煩點.Expires指定的時間分下面二種,這個主要考慮到apache中設置是A還是M.
1.相對文件的最后訪問時間(Atime)
當Apache使用A時間來做Expires時.這樣設置時.他就和max-age的值相等,因為max-age是相對文件的請求時間(Atime).
例如:ExpiresByType text/html A600
由上面我們得知,Apache設置Atime時,過期為600秒時.
Expires=18:00+600=18:10
max-age=18:00+600=18:10
得出:Expires=max-age
2.絕對修改時間(MTime)
這又分二種情況,我們來拿A.htm來講
假設文件的建立時間為18:00.
當用戶Request請求為18:00時,過期為600秒
Expires=18:00+600=18:10
max-age=18:00+600=18:10
得出:Expires等于max-age
當用戶Request請求為18:20時,過期為600秒
Expires=18:00+600=18:10(因為設置成Mtime時,時間由文件建立時間來決定)
max-age=18:20+600=18:30
得出:Expires不等于max-age
另外要注意,象上面這種清況時,max-age優化,所以過期時間為18:30.
在squid,如果沒有指明expires和max-age這二個的截止時間,那它就會使用發式截止時間,如參考 Last-Modified.
其實上面的max-age=18:20+600=18:30,這樣算max-age不對,真實環境要這樣算,max-age過期為http頭中的Age=600過期.
注:Age域值是緩存服務器估計從響應產生或被原始服務器重新證實以來的總時間.age的值是緩存服務器算出來的,原始服務器是沒有的.
總結
以上是生活随笔為你收集整理的负载均衡环境中和如何设置Expires和Etag的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于七大罪恶魔的电影
- 下一篇: 陆风汽车 一只多少钱