Nginx下關於緩存控制字段cache-control的配置說明

HTTP協議的Cache -Control指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置 Cache-Control並不會影響另外一個消息處理過程當中的緩存處理過程。
請求時的緩存指令包括: no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached等。
響應消息中的指令包括: public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。php

下面作一詳細總結, 方便在之後的運維工做中理解和運用.css

一.   瀏覽器中關於Cache的3屬性:
1. Cache-Control:
設置相對過時時間, max-age指明以秒爲單位的緩存時間. 若對靜態資源只緩存一次, 能夠設置max-age的值爲315360000000 (一萬年). 好比對於提交的訂單,爲了防止瀏覽器回退從新提交,可使用Cache-Control之no-store絕對禁止緩存,即使瀏覽器回退依然請求的是服務器,進而判斷訂單的狀態給出相應的提示信息!html

Http協議的cache-control的常見取值及其組合釋義:
no-cache: 數據內容不能被緩存, 每次請求都從新訪問服務器, 如有max-age, 則緩存期間不訪問服務器.
no-store: 不只不能緩存, 連暫存也不能夠(即: 臨時文件夾中不能暫存該資源).
private(默認): 只能在瀏覽器中緩存, 只有在第一次請求的時候才訪問服務器, 如有max-age, 則緩存期間不訪問服務器.
public: 能夠被任何緩存區緩存, 如: 瀏覽器、服務器、代理服務器等.
max-age: 相對過時時間, 即以秒爲單位的緩存時間.
no-cache, private: 打開新窗口時候從新訪問服務器, 若設置max-age, 則緩存期間不訪問服務器.
-  private, 正數的max-age: 後退時候不會訪問服務器.
-  no-cache, 正數的max-age: 後退時會訪問服務器.nginx

2. Expires:
設置以分鐘爲單位的絕對過時時間, 優先級比Cache-Control低, 同時設置Expires和Cache-Control則後者生效. 也就是說要注意一點:  Cache-Control的優先級高於Expiresweb

expires起到控制頁面緩存的做用,合理配置expires能夠減小不少服務器的請求, expires的配置能夠在http段中或者server段中或者location段中.  好比控制圖片等過時時間爲30天, 能夠配置以下:編程

1
2
3
4
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
            root  /var/www/img/ ;
            expires 30d;
        }

再好比:後端

1
2
3
4
location ~ \.(wma|wmv|asf|mp3|mmf|zip|rar|swf|flv)$ {
               root  /var/www/upload/ ;
               expires max;
       }

3. Last-Modified:
該資源的最後修改時間, 在瀏覽器下一次請求資源時, 瀏覽器將先發送一個請求到服務器上, 並附上If-Unmodified-Since頭來講明瀏覽器所緩存資源的最後修改時間, 若是服務器發現沒有修改, 則直接返回304(Not Modified)迴應信息給瀏覽器(內容不多), 若是服務器對比時間發現修改了, 則照常返回所請求的資源. api

須要注意:
1) Last-Modified屬性一般和Expires或Cache-Control屬性配合使用, 由於即便瀏覽器設置緩存, 當用戶點擊」刷新」按鈕時, 瀏覽器會忽略緩存繼續向服務器發送請求, 這時Last-Modified將可以很好的減少迴應開銷.瀏覽器

2) ETag將返回給瀏覽器一個資源ID, 若是有了新版本則正常發送並附上新ID, 不然返回304, 可是在服務器集羣狀況下, 每一個服務器將返回不一樣的ID, 所以不建議使用ETag.緩存

以上描述的客戶端瀏覽器緩存是指存儲位置在客戶端瀏覽器, 可是對客戶端瀏覽器緩存的實際設置工做是在服務器上的資源中完成的. 雖然上面介紹了有關於客戶端瀏覽器緩存的屬性, 可是實際上對這些屬性的設置工做都須要在服務器的資源中作設置. 一般有兩種操做手段對瀏覽器緩存進行設置, 一個是經過頁面指令聲明來設置, 另一個是經過編程方式來設置.

下面是相關頁面設置Cache-Control頭信息的幾個簡單配置:
例一:

1
2
3
if  ($request_uri ~*  "^/$|^/search/.+/|^/company/.+/" ) {
    add_header    Cache-Control  max-age=3600;
   }

我的理解的max-age意思是:客戶端本地的緩存,在配置的生存時間內的,客戶端能夠直接使用,超出生存時間的,到服務器上取新數據。固然這些還要看客戶端瀏覽器的設置。

例二:

1
2
3
location ~ .*\.(css|js|swf|php|htm|html )$ {
       add_header Cache-Control no-store;
}

例三:

1
2
3
location ~ .*\.(js|css)$ {
      expires 10d;
}

例四: 將html結尾的請求加上no-cache

1
2
3
4
5
6
7
8
location / {
     access_log  /data/nginx/log/xxx .log api;
     root  /home/www/html ;
     if  ($request_filename ~ .*\.(htm|html)$)
      {
             add_header Cache-Control no-cache;
      }
}

二.   http Headers模塊 (設置HTTP報文的頭標)
Nginx的ngx_http_headers_module模塊能夠對Cache-Control頭相關的東西進行配置, 好比:

1
2
3
4
5
expires     24h;
expires     0;
expires     -1;
expires     epoch;
add_header  Cache-Control  private;

指令
add_header add_header
expires expires

增長頭標
語法: add_header name value
默認值: none
做用域: http, server, location
當HTTP應答狀態碼爲 200、20四、30一、302 或 304 的時候,增長指定的HTTP頭標。其中頭標的值可使用變量。

expires
語法: expires [time|epoch|max|off
默認值: expires off
做用域: http, server, location
使用本指令能夠控制HTTP應答中的「Expires」和「Cache-Control」的頭標,(起到控制頁面緩存的做用)。

能夠在time值中使用正數或負數。「Expires」頭標的值將經過當前系統時間加上您設定的 time 值來得到。

1
epoch

指定「Expires」的值爲 1 January, 1970, 00:00:01 GMT。

1
max

指定「Expires」的值爲 31 December 2037 23:59:59 GMT,「Cache-Control」的值爲10年。

1
 

指定「Expires」的值爲 服務器當前時間 -1s,即永遠過時.

"Cache-Control"頭標的值由您指定的時間來決定:
    - 負數

1
Cache-Control: no-cache

   - 正數或零

1
Cache-Control: max-age =  #

# 爲您指定時間的秒數。

"off" 表示不修改「Expires」和「Cache-Control」的值;

三.   Cache-Control
Cache-Control 通用消息頭字段被用於在http 請求和響應中經過指定指令來實現緩存機制。緩存指令是單向的, 這意味着在請求設置的指令,在響應中不必定包含相同的指令。

響應頭:Cache-Control:no-cache,強制每次請求直接發送給源服務器,而不通過本地緩存版本的校驗。這對於須要確認認證應用頗有用(能夠和public結合使用),或者嚴格要求使用最新數據 的應用(不惜犧牲使用緩存的全部好處). 通俗解釋:瀏覽器通知服務器,本地沒有緩存數據.

cache-control :
       max-age>0時 直接從遊覽器緩存中提取;
       max-age<=0 時向server發送http請求確認 ,該資源是否有修改, 有的話 返回200 , 無的話 返回304。

通俗解釋:響應頭中的 Cache-Control:max-age=315360000 是通知瀏覽器: 315360000 秒以內不要煩我, 就本身從緩衝區中刷新。

語法
指令不區分大小寫,而且具備可選參數,能夠用令牌或者帶引號的字符串語法。多個指令以逗號分隔。

指令
-   可緩存性
public
     代表響應能夠被任何對象(包括:發送請求的客戶端,代理服務器,等等)緩存。表示相應會被緩存,而且在多用戶間共享。默認是public。
private
     代表響應只能被單個用戶緩存,不能做爲共享緩存(即代理服務器不能緩存它),能夠緩存響應內容。響應只做爲私有的緩存,不能在用戶間共享。若是要求HTTP認證,響應會自動設置爲private。
no-cache
     在釋放緩存副本以前,強制高速緩存將請求提交給原始服務器進行驗證。指定不緩存響應,代表資源不進行緩存。可是設置了no-cache以後並不表明瀏覽器不緩存,而是在緩存前要向服務器確認資源是否被更改。所以有的時候只設置no-cache防止緩存仍是不夠保險,還能夠加上private指令,將過時時間設爲過去的時間。
only-if-cached
     代表客戶端只接受已緩存的響應,而且不要向原始服務器檢查是否有更新的拷貝.

-   到期
max-age=<seconds>
     設置緩存存儲的最大週期,超過這個時間緩存被認爲過時(單位秒)。與Expires相反,時間是相對於請求的時間。max-age會覆蓋掉Expires。
s-maxage=<seconds>
     覆蓋max-age 或者 Expires 頭,可是僅適用於共享緩存(好比各個代理),而且私有緩存中它被忽略。也就是說s-maxage只用於共享緩存,好比CDN緩存(s -> share)。與max-age 的區別是:         max-age用於普通緩存,而s-maxage用於代理緩存。若是存在s-maxage,則會覆蓋max-age 和 Expires.
max-stale[=<seconds>]
     代表客戶端願意接收一個已通過期的資源。 可選的設置一個時間(單位秒),表示響應不能超過的過期時間。
min-fresh=<seconds>
     表示客戶端但願在指定的時間內獲取最新的響應。
stale-while-revalidate=<seconds>
     代表客戶端願意接受陳舊的響應,同時在後臺異步檢查新的響應。秒值指示客戶願意接受陳舊響應的時間長度。
stale-if-error=<seconds>
     表示若是新的檢查失敗,則客戶願意接受陳舊的響應。秒數值表示客戶在初始到期後願意接受陳舊響應的時間。

-   從新驗證和從新加載
must-revalidate
     緩存必須在使用以前驗證舊資源的狀態,而且不可以使用過時資源。表示若是頁面過時,則去服務器進行獲取。
proxy-revalidate
     與must-revalidate做用相同,但它僅適用於共享緩存(例如代理),並被私有緩存忽略。
immutable
     表示響應正文不會隨時間而改變。資源(若是未過時)在服務器上不發生改變,所以客戶端不該發送從新驗證請求頭(例如If-None-Match或If-Modified-Since)來檢查更新,即便用戶顯式地刷新頁面。在Firefox中,immutable只能被用在 https:// transactions.

-   其餘
no-store
     緩存不該存儲有關客戶端請求或服務器響應的任何內容。表示絕對禁止緩存!
no-transform
     不得對資源進行轉換或轉變。Content-Encoding, Content-Range, Content-Type等HTTP頭不能由代理修改。例如,非透明代理能夠對圖像格式進行轉換,以便節省緩存空間或者減小緩慢鏈路上的流量。 no-transform指令不容許這樣作。

兩個小示例
-  禁止緩存
發送以下指令能夠關閉緩存。此外,能夠參考Expires 和 Pragma 標題。

1
Cache-Control: no-cache, no-store, must-revalidate

-  緩存靜態資源節
對於應用程序中不會改變的文件,一般能夠在發送響應頭前添加積極緩存。這包括例如由應用程序提供的靜態文件,例如圖像,CSS文件和JavaScript文件。另請參閱Expires標題。

1
Cache-Control:public, max-age=31536000

這裏擴展一下:
HTTP1.0
HTTP1.0中經過Pragma 控制頁面緩存,一般設置的值爲no- cache,不過這個值不這麼保險,一般還加上Expires置爲0來達到目的。可是如咱們刻意須要瀏覽器或緩存服務器緩存住咱們的頁面這個值則要設置爲 Pragma。

HTTP1.1
HTTP1.1中啓用Cache-Control 來控制頁面的緩存與否,Cache-Control是http1.1 中的標準,能夠當作是 expires 的補充, 使用的是相對時間的概念。注意幾個經常使用的參數:
no-cache:  瀏覽器和緩存服務器都不該該緩存頁面信息;
public:  瀏覽器和緩存服務器均可以緩存頁面信息;
no-store:  請求和響應的信息都不該該被存儲在對方的磁盤系統中;
must-revalidate:  對於客戶機的每次請求,代理服務器必須想服務器驗證緩存是否過期

目前Cache-Control請求字段被各個瀏覽器支持的較好,其優先級也比較高,當和別的字段(如Expires)一塊兒用時,會覆蓋其餘字段。

四. nginx配置管理瀏覽器靜態緩存策略
瀏覽器緩存: expires,  cache-control last-modified,  etag.   先來看一張圖:

每一個狀態的詳細說明以下:
一、Last-Modified
在瀏覽器第一次請求某一個URL時,服務器端的返回狀態會是200,內容是你請求的資源,同時有一個Last-Modified的屬性標記(HttpReponse Header)此文件在服務期端最後被修改的時間,格式相似這樣:

1
Last-Modified:Tue, 24 Feb 2019 08:01:04 GMT

客戶端第二次請求此URL時,根據HTTP協議的規定,瀏覽器會向服務器傳送If-Modified-Since報頭(HttpRequest Header),詢問該時間以後文件是否有被修改過:

1
If-Modified-Since:Tue, 24 Feb 2019 08:01:04 GMT

若是服務器端的資源沒有變化,則自動返回HTTP304(NotChanged.)狀態碼,內容爲空,這樣就節省了傳輸數據量。當服務器端代碼發生改變或者重啓服務器時,則從新發出資源,返回和第一次請求時相似。從而保證不向客戶端重複發出資源,也保證當服務器有變化時,客戶端可以獲得最新的資源。

注意: 若是If-Modified-Since的時間比服務器當前時間(當前的請求時間request_time)還晚,會認爲是個非法請求

二、Etag工做原理
HTTP協議規格說明定義ETag爲「被請求變量的實體標記」(參見14.19)。簡單點即服務器響應時給請求URL標記,並在HTTP響應頭中將其傳送到客戶端,相似服務器端返回的格式:

1
Etag:「5d8c72a5edda8d6a:3239″

客戶端的查詢更新格式是這樣的:

1
If-None-Match:「5d8c72a5edda8d6a:3239″

若是ETag沒改變,則返回狀態304。即: 在客戶端發出請求後,HttpReponse Header中包含Etag:「5d8c72a5edda8d6a:3239″
標識,等於告訴Client端,你拿到的這個的資源有表示ID:5d8c72a5edda8d6a:3239。當下次須要發Request索要同一個URI的時候,瀏覽器同時發出一個If-None-Match報頭(Http RequestHeader)此時包頭中信息包含上次訪問獲得的Etag:「5d8c72a5edda8d6a:3239″標識。

1
If-None-Match:「5d8c72a5edda8d6a:3239「

這樣,Client端等於Cache了兩份,服務器端就會比對2者的etag。若是If-None-Match爲False,不返回200,返回304(Not Modified) Response。

三、Expires
給出的日期/時間後,被響應認爲是過期。如 Expires:Thu, 02 Apr 2009 05:14:08 GMT需和Last-Modified結合使用。用於控制請求文件的有效時間,當請求數據在有效期內時客戶端瀏覽器從緩存請求數據而不是服務器端.當緩存中數據失效或過時,才決定從服務器更新數據。

四、Last-Modified和Expires
Last-Modified標識可以節省一點帶寬,可是仍是逃不掉髮一個HTTP請求出去,並且要和Expires一塊兒用。而Expires標識卻使得瀏覽器乾脆連HTTP請求都不用發,好比當用戶F5或者點擊Refresh按鈕的時候就算對於有Expires的URI,同樣也會發一個HTTP請求出去,因此,Last-Modified仍是要用的,並且要和Expires一塊兒用。

五、Etag和Expires
若是服務器端同時設置了Etag和Expires時,Etag原理一樣,即與 Last-Modified/Etag 對應的 HttpRequestHeader:If-Modified-Since 和 If-None-Match。咱們能夠看到這兩個Header的值和WebServer發出的Last-Modified,Etag值徹底同樣;在徹底匹配If-Modified-Since和If-None-Match即檢查完修改時間和Etag以後,服務器才能返回304.

六、Last-Modified和Etag
分佈式系統裏多臺機器間文件的last-modified必須保持一致,以避免負載均衡到不一樣機器致使比對失敗. 分佈式系統儘可能關閉掉Etag(每臺機器生成的etag都會不同)

Last-Modified和ETags請求的http報頭一塊兒使用,服務器首先產生Last-Modified/Etag標記,服務器可在稍後使用它來判斷頁面是否已經被修改,來決定文件是否繼續緩存

過程以下:
1) 客戶端請求一個頁面(A)。
2) 服務器返回頁面A,並在給A加上一個Last-Modified/ETag。
3) 客戶端展示該頁面,並將頁面連同Last-Modified/ETag一塊兒緩存。
4) 客戶再次請求頁面A,並將上次請求時服務器返回的Last-Modified/ETag一塊兒傳遞給服務器。
5) 服務器檢查該Last-Modified或ETag,並判斷出該頁面自上次客戶端請求以後還未被修改,直接返回響應304和一個空的響應體。

須要注意:
1) Last-Modified和Etag頭都是由WebServer發出的HttpReponse Header,WebServer應該同時支持這兩種頭。
2) WebServer發送完Last-Modified/Etag頭給客戶端後,客戶端會緩存這些頭;
3) 客戶端再次發起相同頁面的請求時,將分別發送與Last-Modified/Etag對應的HttpRequestHeader:If-Modified-Since和If-None-Match。咱們能夠看到這兩個Header的值和WebServer發出的Last-Modified,Etag值徹底同樣;
4) 經過上述值到服務器端檢查,判斷文件是否繼續緩存;

七、關於 Cache-Control: max-age=秒 和 Expires
Expires = 時間,HTTP 1.0 版本,緩存的載止時間,容許客戶端在這個時間以前不去檢查(發請求)
max-age = 秒,HTTP 1.1版本,資源在本地緩存多少秒。
若是max-age和Expires同時存在,則被Cache-Control的max-age覆蓋。

Expires 的一個缺點: 就是返回的到期時間是服務器端的時間,這樣存在一個問題,若是客戶端的時間與服務器的時間相差很大,那麼偏差就很大,因此在HTTP 1.1版開始,使用Cache-Control: max-age=秒替代。

Expires =max-age + 「每次下載時的當前的request時間」

因此一旦從新下載的頁面後,expires就從新計算一次,但last-modified不會變化.

八、基於nginx配置使用總結
分佈式系統(有ng-ha 和 應用的負載均衡),最好使用Last-Modified和Expires,把Etag關閉掉。
1) 關閉etag

1
2
http {
         etag off;
關閉etag, 使用Last-Modified和Expires

2) 配置last-modified(默認開啓)和expires

1
2
3
4
5
6
7
8
9
location ~.*\.(gif|jpg|jpeg|png|bmp|swf)$
         {
                 expires      30d;
         }
 
location ~.*\.(js|css)?$
         {
                 expires      12h;
         }

對於配置了多個location(upstream)的,能夠:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
location  /filebase/  {
             root  /hskj/file/ ;
             autoindex on;
 
             if  ($request_filename ~* ^.*?\.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){
                 add_header Content-Disposition:  'attachment;' ;
             }
 
             if  ($request_filename ~* ^.*?\.(gif|jpg|jpeg|png|bmp|swf)$){
                 expires      30d;
             }
 
             if  ($request_filename ~* ^.*?\.(js|css)$){
                 expires      12h;
             }
}

效果以下:

                                                      這裏順便看一個配置實例: nginx設置不使用緩存 add_header Cache-Control no-cache                                                 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
server {
     listen       443;
     server_name  www.kevin.com;
     charset utf-8;
 
     ssl                  on;
     ssl_certificate       /daka/program/nginx/conf/server .cer;
     ssl_certificate_key   /daka/program/nginx/conf/server .key;
     ssl_session_timeout  5m;
     ssl_protocols  SSLv2 SSLv3 TLSv1;
     ssl_ciphers  HIGH:!aNULL:!MD5;
     ssl_prefer_server_ciphers   on;
 
     #設置瀏覽器緩存
     add_header Cache-Control no-cache;
     add_header Cache-Control private;
  
  
     location  /yp  {
         proxy_redirect off;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass http: //192 .168.0.221:8082 /yp/yp ;
  
         if  ($request_filename ~* .*.(html|htm)$)
          {
          expires -1s;
          }
 
          if  ($request_filename ~* .*.(gif|jpg|jpeg|png|bmp|swf)$)
          {
          expires 30d;
          }
 
          if  ($request_filename ~ .*.(js|css)$)
          {
          expires 12h;
          }
     }
 
        location  /static  {
         proxy_redirect off;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass http: //192 .168.0.221:8082 /static ;
  
         if  ($request_filename ~* .*.(html|htm)$)
          {
          expires -1s;
          }
 
          if  ($request_filename ~* .*.(gif|jpg|jpeg|png|bmp|swf)$)
          {
          expires 30d;
          }
 
          if  ($request_filename ~ .*.(js|css)$)
          {
          expires 12h;
          }
 
     }
  
    location / {
         proxy_redirect off;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass http: //192 .168.0.221:8080/;
#         if (-e $request_filename){
#           rewrite ^/$ https://www.kevin.com:443/invest/index.jhtml permanent;
#         }
  
  
         if  ($request_filename ~* .*.(html|htm)$)
          {
#         expires -1s;
          }
 
          if  ($request_filename ~* .*.(gif|jpg|jpeg|png|bmp|swf)$)
          {
          expires 30d;
          }
 
          if  ($request_filename ~ .*.(js|css)$)
          {
          expires 12h;
          }
          
     }
}

                                                                   運維案例分享: Nginx增長緩存控制字段cache-control                                                           
開發發過來的需求:
1) 對於html文件,cache control設置爲no-cache;
2) 對於js,圖片,css,字體等,設置max-age=2592000. 也就是30天;

注意點:
   -  緩存控制字段cache-control的配置(add_header)要放在http, server, location區域, 或是放在location的if判斷裏, 例如"add_header Cache-Control no-cache;".
   -  若是前面有LB負載代理層, 則緩存控制字段cache-control配置要放在後端的真實服務器nginx的location區域, 而且要指定root根路徑, 不然訪問會出現404 (即找不到訪問路徑);

針對上面的案例需求, 操做記錄以下:
1) 本案中在實際場景中, 有LB層. LB層的nginx配置不須要配置, 這裏只是粘貼下負載配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@fvtlb01 ~] # cat /data/nginx/conf/vhosts/fvtkevin-web.veredholdings-inc.com.conf
upstream fvtkevin-web-inc {
       ip_hash;
       server 172.16.50.73:80  max_fails=3 fail_timeout=15s;
       server 172.16.50.74:80  max_fails=3 fail_timeout=15s;
}
 
   server {
       listen      80;
       server_name fvtkevin-web.veredholdings-inc.com;
     
       access_log   /data/nginx/logs/fvtkevin-web .veredholdings-inc.com-access.log main;
       error_log   /data/nginx/logs/fvtkevin-web .veredholdings-inc.com-error.log;
 
 
  location / {
          proxy_pass http: //fvtkevin-web-inc ;
          proxy_redirect off ;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header REMOTE-HOST $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_connect_timeout 300;
          proxy_send_timeout 300;
          proxy_read_timeout 600;
          proxy_buffer_size 256k;
          proxy_buffers 4 256k;
          proxy_busy_buffers_size 256k;
          proxy_temp_file_write_size 256k;
          proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
          proxy_max_temp_file_size 128m;
          #proxy_cache mycache;                               
          #proxy_cache_valid 200 302 1h;
          #proxy_cache_valid 301 1d;
          #proxy_cache_valid any 1m;
}

2) 緩存控制字段cache-control的配置要放在後端兩臺真實服務器172.16.50.73和172.16.50.74上.
a) 172.16.60.73 (即fvtkevin-dmz01.veredholdings.cn)服務器上緩存控制字段cache-control的配置以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@fvtkevin-dmz01 ~] # cat /data/nginx/conf/vhosts/fvtkevin-web01.veredholdings.cn.conf
server {
       listen      80;
       server_name fvtkevin-dmz01.veredholdings.cn;
     
       access_log   /data/nginx/logs/fvtkevin-dmz01 .veredholdings.cn-access.log main;
       error_log   /data/nginx/logs/fvtkevin-dmz01 .veredholdings.cn-error.log;
 
       location / {
       root  /data/web/kevin ;
       index index.php index.html index.htm;
       }
 
 
       location ~ \.(css|js|gif|jpg|jpeg|png|bmp|swf|ttf|woff|otf|ttc|pfa)$ {
       root  /data/web/kevin ;
             expires 30d;
         }
 
       location ~ \.(html|htm)$ {
           root  /data/web/kevin ;
           add_header Cache-Control no-cache;
         }
 
       location  /document/  {
       alias  /data/web/document/ ;
       }
 
       location ~ \.(css|js|gif|jpg|jpeg|png|bmp|swf|ttf|woff|otf|ttc|pfa)$ {
       root  /data/web/document ;
             expires 30d;
         }
 
       location ~ \.(html|htm)$ {
           root  /data/web/document ;
           add_header Cache-Control no-cache;
         }
 
   }

b) 172.16.60.74 (即fvtkevin-dmz02.veredholdings.cn)服務器上緩存控制字段cache-control的配置以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@fvtkevin-dmz02 ~] # cat /data/nginx/conf/vhosts/fvtkevin-web02.veredholdings.cn.conf
server {
       listen      80;
       server_name fvtkevin-web02.veredholdings.cn;
     
       access_log   /data/nginx/logs/fvtkevin-web02 .veredholdings.cn-access.log main;
       error_log   /data/nginx/logs/fvtkevin-web02 .veredholdings.cn-error.log;
     
       location / {
       root  /data/web/kevin ;
       index index.php index.html index.htm;
       }
 
       location ~ \.(css|js|gif|jpg|jpeg|png|bmp|swf|ttf|woff|otf|ttc|pfa)$ {
       root  /data/web/kevin ;
             expires 30d;
         }
 
       location ~ \.(html|htm)$ {
       root  /data/web/kevin ;
       add_header Cache-Control no-cache;
         }
 
       location  /document/  {
       alias  /data/web/document/ ;
       }
 
 
       location ~ \.(css|js|gif|jpg|jpeg|png|bmp|swf|ttf|woff|otf|ttc|pfa)$ {
       root  /data/web/document ;
             expires 30d;
         }
 
       location ~ \.(html|htm)$ {
           root  /data/web/document ;
           add_header Cache-Control no-cache;
         }
 
   }

以上配置中, 關於緩存控制字段cache-control的配置主要有兩個:
1) http://fvtkevin-web.veredholdings-inc.com/ 下:
     對於html, html格式的文件,cache control設置爲no-cache;
     對於js,圖片,css,字體等,設置max-age=2592000;
     這是基於/data/web/kevin的root根目錄下的
2) http://fvtkevin-web.veredholdings-inc.com/document 下:
     對於html, html格式的文件,cache control設置爲no-cache;
     對於js,圖片,css,字體等,設置max-age=2592000;
     這是基於/data/web/document的root根目錄下的

以上配置後, 訪問http://fvtkevin-web.veredholdings-inc.com/ 或者 http://fvtkevin-web.veredholdings-inc.com/document 進行驗證. 這裏驗證下http://fvtkevin-web.veredholdings-inc.com/, 效果以下:

 

上面顯示了http://fvtkevin-web.veredholdings-inc.com/ 首頁(即index.html文件)訪問頭部信息裏有"no-cache"信息! 

上面顯示了http://fvtkevin-web.veredholdings-inc.com/*.js文件訪問的頭部信息裏的緩存時間設置! 

相關文章
相關標籤/搜索