溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Etag和Expires性能調(diào)優(yōu)的方法是什么

發(fā)布時(shí)間:2022-01-10 17:03:47 來(lái)源:億速云 閱讀:165 作者:iii 欄目:云計(jì)算

這篇文章主要介紹“Etag和Expires性能調(diào)優(yōu)的方法是什么”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Etag和Expires性能調(diào)優(yōu)的方法是什么”文章能幫助大家解決問(wèn)題。

1、Etag和Expires中Client 端Http Request Header及Server端Http Reponse Header工作原理。
2、靜態(tài)下Apache、Lighttpd和Nginx中Etag和Expires配置
3、非實(shí)時(shí)交互動(dòng)態(tài)頁(yè)面中Etag和Expires處理
在客戶端通過(guò)瀏覽器發(fā)出第一次請(qǐng)求某一個(gè)URL時(shí),根據(jù) HTTP 協(xié)議的規(guī)定,瀏覽器會(huì)向服務(wù)器傳送報(bào)頭(Http Request Header),服務(wù)器端響應(yīng)同時(shí)記錄相關(guān)屬性標(biāo)記(Http Reponse Header),服務(wù)器端的返回狀態(tài)會(huì)是200,格式類似如下:
HTTP/1.1 200 OK
Date: Tue, 03 Mar 2009 04:58:40 GMT
Content-Type: image/jpeg
Content-Length: 83185
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
Cache-Control: max-age=2592000

Expires: Thu, 02 Apr 2009 05:14:08 GMT
Etag: "5d8c72a5edda8d6a:3239″

客戶端第二次請(qǐng)求此URL時(shí),根據(jù) HTTP 協(xié)議的規(guī)定,瀏覽器會(huì)向服務(wù)器傳送報(bào)頭(Http Request Header),服務(wù)器端響應(yīng)并記錄相關(guān)記錄屬性標(biāo)記文件沒(méi)有發(fā)生改動(dòng),服務(wù)器端返回304,直接從緩存中讀?。?br/> HTTP/1.x 304 Not Modified
Date: Tue, 03 Mar 2009 05:03:56 GMT
Content-Type: image/jpeg
Content-Length: 83185
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
Cache-Control: max-age=2592000
Expires: Thu, 02 Apr 2009 05:14:08 GMT
Etag: "5d8c72a5edda8d6a:3239″
其中Last-Modified、Expires和Etag是標(biāo)記頁(yè)面緩存標(biāo)識(shí)

一、Last-Modified、Expires和Etag相關(guān)工作原理
1、Last-Modified
在瀏覽器第一次請(qǐng)求某一個(gè)URL時(shí),服務(wù)器端的返回狀態(tài)會(huì)是200,內(nèi)容是你請(qǐng)求的資源,同時(shí)有一個(gè)Last-Modified的屬性標(biāo)記(Http Reponse Header)此文件在服務(wù)期端最后被修改的時(shí)間,格式類似這樣:
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
客戶端第二次請(qǐng)求此URL時(shí),根據(jù) HTTP 協(xié)議的規(guī)定,瀏覽器會(huì)向服務(wù)器傳送 If-Modified-Since 報(bào)頭(Http Request Header),詢問(wèn)該時(shí)間之后文件是否有被修改過(guò):
If-Modified-Since: Tue, 24 Feb 2009 08:01:04 GMT
如果服務(wù)器端的資源沒(méi)有變化,則自動(dòng)返回 HTTP 304 (NotChanged.)狀態(tài)碼,內(nèi)容為空,這樣就節(jié)省了傳輸數(shù)據(jù)量。當(dāng)服務(wù)器端代碼發(fā)生改變或者重啟服務(wù)器時(shí),則重新發(fā)出資源,返回和第一次請(qǐng)求時(shí)類似。從而保證不向客戶端重復(fù)發(fā)出資源,也保證當(dāng)服務(wù)器有變化時(shí),客戶端能夠得到最新的資源。
注:如果If-Modified-Since的時(shí)間比服務(wù)器當(dāng)前時(shí)間(當(dāng)前的請(qǐng)求時(shí)間request_time)還晚,會(huì)認(rèn)為是個(gè)非法請(qǐng)求

2、Etag工作原理
HTTP 協(xié)議規(guī)格說(shuō)明定義ETag為"被請(qǐng)求變量的實(shí)體標(biāo)記" (參見(jiàn)14.19)。簡(jiǎn)單點(diǎn)即服務(wù)器響應(yīng)時(shí)給請(qǐng)求URL標(biāo)記,并在HTTP響應(yīng)頭中將其傳送到客戶端,類似服務(wù)器端返回的格式:
Etag: "5d8c72a5edda8d6a:3239″
客戶端的查詢更新格式是這樣的:
If-None-Match: "5d8c72a5edda8d6a:3239″
如果ETag沒(méi)改變,則返回狀態(tài)304。
即:在客戶端發(fā)出請(qǐng)求后,Http Reponse Header中包含 Etag: "5d8c72a5edda8d6a:3239″
標(biāo)識(shí),等于告訴Client端,你拿到的這個(gè)的資源有表示ID:5d8c72a5edda8d6a:3239。當(dāng)下次需要發(fā)Request索要同一個(gè)URI的時(shí)候,瀏覽器同時(shí)發(fā)出一個(gè)If-None-Match報(bào)頭( Http RequestHeader)此時(shí)包頭中信息包含上次訪問(wèn)得到的Etag: "5d8c72a5edda8d6a:3239″標(biāo)識(shí)。
If-None-Match: "5d8c72a5edda8d6a:3239"
,這樣,Client端等于Cache了兩份,服務(wù)器端就會(huì)比對(duì)2者的etag。如果If-None-Match為False,不返回200,返回304 (Not Modified) Response。

3、Expires
給出的日期/時(shí)間后,被響應(yīng)認(rèn)為是過(guò)時(shí)。如Expires: Thu, 02 Apr 2009 05:14:08 GMT
需和Last-Modified結(jié)合使用。用于控制請(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ù)。

4、Last-Modified和Expires
Last-Modified標(biāo)識(shí)能夠節(jié)省一點(diǎn)帶寬,但是還是逃不掉發(fā)一個(gè)HTTP請(qǐng)求出去,而且要和Expires一起用。而Expires標(biāo)識(shí)卻使得瀏覽器干脆連HTTP請(qǐng)求都不用發(fā),比如當(dāng)用戶F5或者點(diǎn)擊Refresh按鈕的時(shí)候就算對(duì)于有Expires的URI,一樣也會(huì)發(fā)一個(gè)HTTP請(qǐng)求出去,所以,Last-Modified還是要用的,而 且要和Expires一起用。

5、Etag和Expires
如果服務(wù)器端同時(shí)設(shè)置了Etag和Expires時(shí),Etag原理同樣,即與Last-Modified/Etag對(duì)應(yīng)的HttpRequest Header:If-Modified-Since和If-None-Match。我們可以看到這兩個(gè)Header的值和WebServer發(fā)出的Last-Modified,Etag值完全一樣;在完全匹配If-Modified-Since和If-None-Match即檢查完修改時(shí)間和Etag之后,服務(wù)器才能返回304.

6、Last-Modified和Etag
Last-Modified 和ETags請(qǐng)求的http報(bào)頭一起使用,服務(wù)器首先產(chǎn)生 Last-Modified/Etag標(biāo)記,服務(wù)器可在稍后使用它來(lái)判斷頁(yè)面是否已經(jīng)被修改,來(lái)決定文件是否繼續(xù)緩存
過(guò)程如下:
1. 客戶端請(qǐng)求一個(gè)頁(yè)面(A)。
2. 服務(wù)器返回頁(yè)面A,并在給A加上一個(gè)Last-Modified/ETag。
3. 客戶端展現(xiàn)該頁(yè)面,并將頁(yè)面連同Last-Modified/ETag一起緩存。
4. 客戶再次請(qǐng)求頁(yè)面A,并將上次請(qǐng)求時(shí)服務(wù)器返回的Last-Modified/ETag一起傳遞給服務(wù)器。
5. 服務(wù)器檢查該Last-Modified或ETag,并判斷出該頁(yè)面自上次客戶端請(qǐng)求之后還未被修改,直接返回響應(yīng)304和一個(gè)空的響應(yīng)體。
注:
1、Last-Modified和Etag頭都是由Web Server發(fā)出的Http Reponse Header,Web Server應(yīng)該同時(shí)支持這兩種頭。
2、Web Server發(fā)送完Last-Modified/Etag頭給客戶端后,客戶端會(huì)緩存這些頭;
3、客戶端再次發(fā)起相同頁(yè)面的請(qǐng)求時(shí),將分別發(fā)送與Last-Modified/Etag對(duì)應(yīng)的Http RequestHeader:If-Modified-Since和If-None-Match。我們可以看到這兩個(gè)Header的值和WebServer發(fā)出的Last-Modified,Etag值完全一樣;
4、通過(guò)上述值到服務(wù)器端檢查,判斷文件是否繼續(xù)緩存;

二、Apache、Lighttpd和Nginx中針配置Etag和Expires,有效緩存純靜態(tài)如css/js/pic/頁(yè)面/流媒體等文件。
A、Expires
A.1、Apache Etag
使用Apache的mod_expires 模塊來(lái)設(shè)置,這包括控制應(yīng) Dd 時(shí)的Expires頭內(nèi)容和Cache-Control頭的max-age指令
ExpiresActive On
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/bmp "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/txt  "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"

<ifmodule mod_expires.c>
<filesmatch "\.(jpg|gif|png|css|js)$">
ExpiresActive on
ExpiresDefault "access plus 1 year"
</filesmatch>
</ifmodule>
當(dāng)設(shè)置了expires后,會(huì)自動(dòng)輸出Cache-Control 的max-age 信息
具體關(guān)于 Expires 詳細(xì)內(nèi)容可以查看Apache官方文檔。
在這個(gè)時(shí)間段里,該文件的請(qǐng)求都將直接通過(guò)緩存服務(wù)器獲取,
當(dāng)然如果需要忽略瀏覽器的刷新請(qǐng)求(F5),緩存服務(wù)器squid還需要使用 refresh_pattern 選項(xiàng)來(lái)忽略該請(qǐng)求
refresh_pattern -i \.gif$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.jpg$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.jpeg$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.png$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.bmp$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.htm$ 60 100% 100 ignore-reload
refresh_pattern -i \.html$ 1440 50% 28800 ignore-reload
refresh_pattern -i \.xml$ 1440 50% 28800 ignore-reload
refresh_pattern -i \.txt$ 1440 50% 28800 ignore-reload
refresh_pattern -i \.css$ 1440 50% 28800 reload-into-ims
refresh_pattern -i \.js$ 60 50% 100 reload-into-ims
refresh_pattern . 10 50% 60
有關(guān)Squid中Expires的說(shuō)明,請(qǐng)參考Squid官方中refresh_pattern介紹。

A.2、Lighttpd Expires
和Apache一樣Lighttpd設(shè)置expire也要先查看是否支持了mod_expire模塊,
下面的設(shè)置是讓URI中所有images目錄下的文件1小時(shí)后過(guò)期;
expire.url = ( "/images/" => "access 1 hours" )
下面是讓作用于images目錄及其子目錄的文件;
$HTTP["url"] =~ "^/images/" {
expire.url = ( "" => "access 1 hours" )
}
也可以指定文件的類型;
$HTTP["url"] =~ "\.(jpg|gif|png|css|js)$" {
expire.url = ( "" => "access 1 hours" )
}
具體參考Lighttpd官方Expires解釋

A.3、Nginx中Expires
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
這類文件并不常修改,通過(guò) expires 指令來(lái)控制其在瀏覽器的緩存,以減少不必要的請(qǐng)求。 expires 指令可以控制 HTTP 應(yīng)Dd Expires "和" Cache-Control "的頭標(biāo)(起到控制頁(yè)面緩存的作用)。其他請(qǐng)參考Nginx中Expires

B.1、Apache中Etag設(shè)置
在Apache中設(shè)置Etag的支持比較簡(jiǎn)單,只用在含有靜態(tài)文件的目錄中建立一個(gè)文件.htaccess, 里面加入:
FileETag MTime Size
這樣就行了,詳細(xì)的可以參考Apache的FileEtag文檔頁(yè)

B.2、Lighttpd Etag
在Lighttpd中設(shè)置Etag支持:
etag.use-inode: 是否使用inode作為Etag
etag.use-mtime: 是否使用文件修改時(shí)間作為Etag
etag.use-size: 是否使用文件大小作為Etag
static-file.etags: 是否啟用Etag的功能
第四個(gè)參數(shù)肯定是要enable的, 前面三個(gè)就看實(shí)際的需要來(lái)選吧,推薦使用修改時(shí)間

B.3、 Nginx Etag
Nginx中默認(rèn)沒(méi)有添加對(duì)Etag標(biāo)識(shí).Igor Sysoev的觀點(diǎn)"在對(duì)靜態(tài)文件處理上看不出如何Etag好于Last-Modified標(biāo)識(shí)。"
Note:
Yes, it's addition,and it's easy to add, however, I do not see howETag is better than Last-Modified for static files. -Igor Sysoev
A nice short description is here:
http://www.mnot.net/cache_docs/#WORK
It looks to me that it makes some caches out there to cache theresponse from the origin server more reliable as in rfc2616(ftp://ftp.rfc-editor.org/in-notes/rfc2616.txt) is written.
3.11 Entity Tags 13.3.2 Entity Tag Cache Validators 14.19 ETag
當(dāng)然也有第三方nginx-static-etags 模塊了,請(qǐng)參考
http://mikewest.org/2008/11/generating-etags-for-static-content-using-nginx

三、對(duì)于非實(shí)時(shí)交互動(dòng)態(tài)頁(yè)面中Epires和Etag處理
對(duì)數(shù)據(jù)更新并不頻繁、如tag分類歸檔等等,可以考慮對(duì)其cache。簡(jiǎn)單點(diǎn)就是在非實(shí)時(shí)交互的動(dòng)態(tài)程序中輸出expires和etag標(biāo)識(shí),讓其緩存。但需要注意關(guān)閉session,防止http response時(shí)http header包含session id標(biāo)識(shí);
3.1、Expires
如expires.php
<?php
header('Cache-Control: max-age=86400,must-revalidate');
header('Last-Modified: ' .gmdate('D, d M Y H:i:s') . ' GMT' );
header("Expires: " .gmdate ('D, d M Y H:i:s', time() + '86400′ ). ' GMT');
?>
以上信息表示該文件自請(qǐng)求后24小時(shí)后過(guò)期。
其他需要處理的動(dòng)態(tài)頁(yè)面直接調(diào)用即可。
3.2、Etag
根據(jù)Http返回狀態(tài)來(lái)處理。當(dāng)返回304直接從緩存中讀取
如etag.php
<?php
cache();
echo date("Y-m-d H:i:s");
function cache()
{
$etag = "http://www.jb51.net";
if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
{
header('Etag:'.$etag,true,304);
exit;
}
else header('Etag:'.$etag);
}
?> 

我們知道合理配置etag能節(jié)省不少帶寬。 
事實(shí)上,配置etag緩存并沒(méi)有配置Last-Modified header 效果好。 
當(dāng)我們并不知道修改時(shí)間,Etag對(duì)動(dòng)態(tài)內(nèi)容還是比較有用。 

關(guān)于etag補(bǔ)充: 
幾個(gè)不同或者需要補(bǔ)充的地方: 
1、“當(dāng)然,Etag 對(duì)多數(shù)站點(diǎn)性能的影響并不是很大?!睉?yīng)該說(shuō) Etag 在正確使用的情況下,會(huì)讓大量的請(qǐng)求以 304 頭方式響應(yīng),可以相當(dāng)?shù)墓?jié)省服務(wù)器資源和帶寬。之前一些地方寫的不要使用 Etag,是基于有些 webserver 的 Etag 的計(jì)算方法中包含了 inode,這在多臺(tái)web服務(wù)器的情況不可采用的,而改變這個(gè)計(jì)算方法就可以了。 
2、對(duì)于盡早刷新這點(diǎn),PHP 幾乎是做不到的。即使你執(zhí)行了 flush 以及類似的函數(shù),也要等到請(qǐng)求完全執(zhí)行之后,才會(huì)輸出給瀏覽器端。 
3、AJAX 使用 GET 和 POST 各有好處,GET 方式可以更快響應(yīng),但是可能會(huì)有被瀏覽器緩存的問(wèn)題,一般都需要加個(gè)隨機(jī)數(shù)來(lái)避免,POST 方式則不會(huì)。所以最好是根據(jù)自己的情況分別使用 GET 和 POST 方法。

關(guān)于“Etag和Expires性能調(diào)優(yōu)的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI