nginx不緩存請求
① nginx緩存(proxy_cache模塊)
緩存的基本思想是利用客戶端訪問的時間局限性,將客戶端訪問過的內容做一個副本,在一定時間內存放到本地,當改數據下次被訪問時,不必連接到後端伺服器反復去查詢數據,而是由本地保存的副本響應數據。
保存在本地的這些副本具有一個過期時間,超過該時間將會更新。判斷一個副本數據是否為過期數據的辦法有很多,可以使用保留時間來判斷,也可以使用數據完整度來判斷。
許多Web伺服器還具有校驗功能,就是當某些副本數據過期以後,先向後端伺服器發送校驗請求,後端伺服器對這些數據進行校驗,如果發現原數據和副本沒有差別,則將過期副本重新置為可用副本。
以上nginx配置結合使用:
proxy_params文件的配置如下:
訪問一次頁面,並向 http://www.blogs-s.com:8080/api/ 發起一個介面數據請求,查看/cache/nginx目錄下的緩存結果:
ngx_cache_purge是nginx的第三方模塊,能夠幫助我清除nginx中的緩存。
在之前的nginx編譯安裝中我們是沒有把緩存的清除模塊ngx_cache_purge編譯進去的,如果啟動了緩存,沒有安裝這個模塊,在之後的調試中我們嘗試去清除緩存時,將會出現異常:
這個異常是在指示我們,找不到該指令的驅動,需要按照相關模塊。
ngx_cache_purge只是nginx的第三方模塊,並不是某個特殊的軟體,所以我們需要對nginx重新進行編譯,操作如下:
配置nginx:
再一次啟動nginx成功;
接下來進行緩存清除測試,訪問: http://blogs.com/clear_cache/api/index.php , 訪問這個連接將會清除介面: http://blogs.com/api/index.php 的緩存數據。
結果如下:
在項目開發中,不可能出現什麼都需要緩存的數據,緩存僅僅適合去緩存查詢頻繁,但是不需要實時更新的數據,這個是它適合的場景,而我們上面的配置,只要是訪問api介面目錄就會緩存介面的數據,這樣對於一些需要實時更新的介面數據來說是不合理的,需要控制好nginx的緩存去緩存什麼以及不緩存什麼
set 指令為變數設置,proxy_no_cache參數中的值可以設置多個,但是多個值中,只要有一個是不為0的,就會通過緩存響應數據。
該指令用於配置一塊公用的內存區域的名稱,該區域可以存放緩存的索引數據。這些數據在Nginx伺服器啟動時由緩存索引重建進程負責建立,在Nginx伺服器的整個運行過程中由緩存管理進程負責定時檢測過期數據,檢索等管理工作。
該指令用於配置Nginx伺服器向客戶端發送響應數據時,不從緩存中獲取的條件。這些條件支持使用Nginx 配置的常用變數。
看一個例子:
其中,Scookie_nocache、Sarg_nocache、Sarg_comment、Shttp_pragma 和Shttp_authorization 都是Nginx配置文件的變數,
該指令用於設置Nginx伺服器在內存中為緩存數據建立索引時使用的關鍵字
如果我們希望緩存數據包含伺服器主機名稱等關鍵字,則可以將該指令設置為:
該指令用於設置是否開啟緩存的鎖功能。在緩存中,某些數據項可以同時被多個請求返回的響應數據填充。開啟該功能後,Nginx伺服器同時只能有一個請求填充緩存中的某一數據項,這相當於給該數據項上鎖,不允許其他請求操作。其他的請求如果也想填充該項,必須等待該數據項的鎖被釋放。這個等待時間由 proxy_cache_lock_timeout 指令配置。
該指令用於設置緩存的鎖功能開啟以後鎖的超時時間。具體細節參見proxy_cache_lock 指令的相關內容
其中,time為設置的時間,默認為5s。
該指令用於設置客戶端請求發送的次數,當客戶端向被代理伺服器發送相同請求達到該指令設定的次數後,Nginx伺服器才對該請求的響應數據做緩存。合理設置該值可以有效地降低硬碟上緩存數據的數量,並提高緩存的命中率。
其中,number為設置的次數。默認設置為1。
該指令用於設置Nginx伺服器存儲緩存數據的路徑以及和緩存索引相關的內容
該指令設置比較復雜,一般需要設置前面三個指令的情形比較多,後面的幾個變數與Nginx伺服器緩存索引重建進程及管理進程的性能相關,一般情況下保持默認設置就可以了。我們來看幾個簡單的配置實例:
如果Nginx在訪問被代理伺服器過程中出現被代理的伺服器無法訪問或者訪問錯誤等現象時,Nginx伺服器可以使用歷史緩存響應客戶端的請求,這些數據不一定和被代理伺服器上最新的數據相一致,但對於更新頻率不高的後端伺服器來說,Nginx伺服器的該功能在一定程度上能夠為客戶端提供不間斷訪問。該指令用來設置一些狀態,當後端被代理的伺服器處於這些狀態時,Nginx伺服器啟用該功能。
該指令可以支持的狀態如語法結構中所示。
該指令可以針對不同的HTTP響應狀態設置不同的緩存時間,
該指令同於配置在什麼情況下不使用cache功能
該指令配置是否在本地磁碟緩存來自被代理伺服器的響應數據。這是Nginx伺服器提供的另一種緩存數據的方法,但是該功能相對 Proxy Cache簡單一些,它不提供緩存過期更新、內存索引建立等功能,不佔用內存空間,對靜態數據的效果比較好。
Proxy Store方法多使用在被代理伺服器端發生錯誤的情況下,用來緩存被代理伺服器的響應數據。
該指令用於設置用戶或用戶組對Proxy Store緩存的數據的訪問許可權,
有關Proxy Store方法的使用,我們通過官方給出的實例加深理解,在該實例中筆者通過注釋對配置做了說明:
② Nginx緩存設置教程
| 這篇文章主要介紹了Nginx緩存設置案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下 |
在開發調試web的時候,經常會碰到因瀏覽器緩存(cache)而經常要去清空緩存或者強制刷新來測試的煩惱,提供下apache不緩存配置和nginx不緩存配置的設置。在常用的緩存設置裡面有兩種方式,都是使用add_header來設置:分別為Cache-Control和Pragma。
對於站點中不經常修改的靜態內容(如圖片,JS,CSS),可以在伺服器中設置expires過期時間,控制瀏覽器緩存,達到有效減小帶寬流量,降低伺服器壓力的目的。
以Nginx伺服器為例:
【背景】:Expires是Web伺服器響應消息頭欄位,在響應http請求時告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器緩存取數據,而無需再次請求。
【相關資料】
1、Cache-control策略
Cache-Control與Expires的作用一致,都是指明當前資源的有效期,控制瀏覽器是否直接從瀏覽器緩存取數據還是重新發請求到伺服器取數據。只不過Cache-Control的選擇更多,設置更細致,如果同時設置的話,其優先順序高於Expires。
http協議頭Cache-Control :
值可以是public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age
各個消息中的指令含義如下:
Last-Modified/If-Modified-Since
其最終達到的就是等效於設置這三類html緩存技術:
③ nginx基本配置(參考)
Nginx是一款自由的、開源的、高性能的HTTP伺服器和反向代理伺服器;同時也是一個IMAP、POP3、SMTP代理伺服器;Nginx可以作為一個HTTP伺服器進行網站的發布處理,另外Nginx可以作為反向代理進行負載均衡的實現。
1、全局塊:配置影響nginx全局的指令。一般有運行nginx伺服器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,允許生成worker process數等。
2、events塊:配置影響nginx伺服器或與用戶的網路連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網路連接序列化等。
3、http塊:可以嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。
4、server塊:配置虛擬主機的相關參數,一個http中可以有多個server。
5、location塊:配置請求的路由,以及各種頁面的處理情況。
6、緩存控制欄位cache-control的配置說明 ( https://www.cnblogs.com/kevingrace/p/10459429.html )
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。
no-cache: 數據內容不能被緩存, 每次請求都重新訪問伺服器, 若有max-age, 則緩存期間不訪問伺服器.
no-store: 不僅不能緩存, 連暫存也不可以(即: 臨時文件夾中不能暫存該資源).
private(默認): 只能在瀏覽器中緩存, 只有在第一次請求的時候才訪問伺服器, 若有max-age, 則緩存期間不訪問伺服器.
public: 可以被任何緩存區緩存, 如: 瀏覽器、伺服器、代理伺服器等.
max-age: 相對過期時間, 即以秒為單位的緩存時間.
no-cache, private: 打開新窗口時候重新訪問伺服器, 若設置max-age, 則緩存期間不訪問伺服器.
設置以分鍾為單位的絕對過期時間, 優先順序比Cache-Control低, 同時設置Expires和Cache-Control則後者生效. 也就是說要注意一點: Cache-Control的優先順序高於Expires
expires起到控制頁面緩存的作用,合理配置expires可以減少很多伺服器的請求, expires的配置可以在http段中或者server段中或者location段中. 比如控制圖片等過期時間為30天
客戶端必須設置正向代理伺服器,當然前提是要知道正向代理伺服器的IP地址,還有代理程序的埠。
"它代理的是客戶端,代客戶端發出請求",是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理發送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。
正向代理的用途:
(1)訪問原來無法訪問的資源,如Google
(2) 可以做緩存,加速訪問資源
(3)對客戶端訪問授權,上網進行認證
(4)代理可以記錄用戶訪問記錄(上網行為管理),對外隱藏用戶信息
多個客戶端給伺服器發送的請求,Nginx伺服器接收到之後,按照一定的規則分發給了後端的業務處理伺服器進行處理了。此時~請求的來源也就是客戶端是明確的,但是請求具體由哪台伺服器處理的並不明確了,Nginx扮演的就是一個反向代理角色。
客戶端是無感知代理的存在的,反向代理對外都是透明的,訪問者並不知道自己訪問的是一個代理。因為客戶端不需要任何配置就可以訪問。
反向代理,"它代理的是服務端,代服務端接收請求",主要用於伺服器集群分布式部署的情況下,反向代理隱藏了伺服器的信息。
反向代理的作用:
(1)保證內網的安全,通常將反向代理作為公網訪問地址,Web伺服器是內網
(2)負載均衡,通過反向代理伺服器來優化網站的負載
④ 怎麼關閉Nginx 的緩存
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
#禁止緩存,每次都從伺服器請求
add_header Cache-Control no-store;
}
⑤ 基於Nginx設置瀏覽器協商緩存過程詳解
一、強緩存與協商緩存的區別
強緩存:瀏覽器不與服務端協商直接取瀏覽器緩存
協商緩存:瀏覽器會先向伺服器確認資源的有效性後才決定是從緩存中取資源還是重新獲取資源
二、協商緩存運作原理
現在有一個這樣的業務情景:後端的靜態資源會不定時地發生更新,而因為瀏覽器默認使用強緩存,會默認從瀏覽器緩存中取到過時的資源。
現在我們希望瀏覽器每次獲取資源的時候都向後端確認資源是否更新,就要設置瀏覽器使用協商緩存
那麼後端如何判斷資源是否更新了呢?這時就要用到Etag和Last-Modified兩項響應頭。
每次收到一個靜態資源的請求時,後端都將資源的最後修改時間(Last-Modified)、根據資源內容計算出來的Etag放在響應頭給前端。
前端收到響應後將這兩項緩存起來,然後在下次請求同樣資源的時候,將這兩項的內容放到If-Modified-Since和If-None-Match這兩項請求頭中。
服務端收到這兩項後,會與資源當前生成的Etag和Last-Modified做比較,如果兩者都一致,說明資源沒有更新,服務端會返回304空響應;否則,說明資源有更新,服務端會將完整的資源內容返回
實現
那麼如何實現這樣一個復雜的過程呢?其實很簡單,只要使用nginx作為靜態資源的伺服器,再在響應頭加上Cache-Control:no-cache就可以了。
下面來分步驟實現一下
1. 使用nginx作為靜態資源的伺服器
在nginx的配置中,將對靜態資源的請求映射到資源的磁碟路徑上
http {
server {
listen 80;
...
location /picture/ {
alias D:/luozixi/tcp_test/picture/;
# alias是重定義路徑
# 比如訪問127.0.0.1/picture/1_new.gif,則會映射為訪問D:/luozixi/tcp_test/picture/1_new.gif
# web應用根本不會收到請求,picture的請求都被nginx處理了
# alias是替換,root是拼接
autoindex on;
}
}
}
2. 重新載入nginx配置
3. 此時,請求靜態資源的時候nginx會自動在response頭中加上Etag和Last-Modified兩項
4. 但是這時發現,如果不配置Cache-Contrl: no-cache,瀏覽器在下次請求這個資源的時候不會將請求發向後端,而是直接從緩存中獲取資源
5. 在nginx中配置
location /picture/ {
add_header Cache-Control no-cache;
alias D:/luozixi/tcp_test/picture/;
}
6.清除瀏覽器緩存後第一次發起請求,會得到一個正常的200 Response,而且響應頭里已經有了Cache-Control: no-cache,表示使用協商緩存
7.再次發起請求後,會發現請求頭已經帶上了If-Modified-Since和If-None-Match兩項
8.服務端(nginx)收到這兩項後,會與資源當前生成的Etag和Last-Modified做比較,如果兩者都一致,說明資源沒有更新,服務端會返回304空響應;否則,說明資源有更新,服務端會將完整的資源內容返回
另外,伺服器驗證If-Modified-Since的方式只是簡單的字元串比較,即使資源的Last-Modified比If-Modified-Since要早,服務端仍認為資源有更新
9.瀏覽器在收到304響應後,會從瀏覽器緩存中取資源。因此速度非常塊
三、no-cache與no-store的區別
no-cache表示不緩存過期資源,緩存會向伺服器進行有效處理確認之後處理資源
而no-store才是真正的不進行緩存。
⑥ nginx如何通過http頭禁用瀏覽器緩存
如果expires 和 add_header 同時開啟的情況下,則add_header優於expires生效 #Cache-Control比Expires可以控制的多一些, 而且Cache-Control會重寫Expires的規則 #設置禁止瀏覽器緩存,每次都從伺服器請求 add_header Cache-Control no-cache;
⑦ 配置nginx有時接收不到請求
換個埠試試。
請求包數據較大,導致nginx內存緩存不夠需要臨時寫入文件,寫入文件時許可權不夠,寫入失敗,可以換個埠重新進入。
修改nginx配置文件,啟動用戶修改為root。
⑧ 請問Nginx緩存不起作用的原因,感謝大家。
200:伺服器已成功處理了請求,這表示伺服器提供了請求的內容。=== 如果不想讓代理或瀏覽器緩存,加no-cache參數 add_header Cache-Control no-cache;這樣瀏覽器F5...
⑨ nginx如何設置不使用緩存
在開發調試web的時候,經常會碰到因瀏覽器緩存(cache)而經常要去清空緩存或者強制刷新來測試的煩惱,提供下apache不緩存配置和nginx不緩存配置的設置。
apache:
首先確定配置文件httpd.conf中確已經載入mod_headers模塊。
LoadMole headers_mole moles/mod_headers.so
我們可以根據文件類型來讓瀏覽器每次都從伺服器讀取,這里測試用css、js、swf、php、html、htm這幾種文件。
<FilesMatch 「\.(css|js|swf|php|htm|html)$」>
Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
Header set Pragma "no-cache"
</FilesMatch>
nginx:
location ~ .*\.(css|js|swf|php|htm|html )$ {
add_header Cache-Control no-store;
}
對於站點中不經常修改的靜態內容(如圖片,JS,CSS),可以在伺服器中設置expires過期時間,控制瀏覽器緩存,達到有效減小帶寬流量,降低伺服器壓力的目的。
以Nginx伺服器為例:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
#過期時間為30天,
#圖片文件不怎麼更新,過期可以設大一點,
#如果頻繁更新,則可以設置得小一點。
expires 30d;
}
location ~ .*\.(js|css)$ {
expires 10d;
}
⑩ nginx 緩存機制
Nginx緩存的基本思路
基本思想是利用客戶訪問的時間局部性原理,對客戶已經訪問過的內容在Nginx伺服器本地建立副本,這樣在一段時間內再次訪問該數據,就不需要通過Nginx伺服器再次向後端伺服器發出請求,所以能夠減少Nginx伺服器與後端伺服器之間的網路流量,減輕網路擁塞,同時還能減小數據傳輸延遲,提高用戶訪問速度。同時,當後端伺服器宕機時,Nginx伺服器上的副本資源還能夠回應相關的用戶請求,這樣能夠提高後端伺服器的魯棒性。
對於緩存,我們大概會有以下問題:
(1)緩存文件放在哪兒?
(2)緩存的空間大小是否可以限定?
(3)如何指定哪些請求被緩存?
(4)緩存的有效期是多久?
(5)對於某些請求,是否可以不走緩存?
解決這些問題後,nginx的緩存也就基本配置完成了,下面看詳細配置過程
開啟緩存
要使用緩存,首先要使用 proxy_cache_path 這個指令(必須放在 http 上下文的頂層位置),然後在目標上下文中使用 proxy_cache 指令
配置示例
proxy_cache_path 有兩個必填參數,第一個參數為 緩存目錄,第二個參數keys_zone指定緩存名稱和佔用內存空間的大小(註:示例中的10m是對內存中緩存內容元數據信息大小的限制,如果想限制緩存總量大小,需要用 max_size 參數)
proxy_cache 的參數為之前指定的緩存名稱
緩存管理的相關進程
在緩存工作中有兩個附加進程:
(1)緩存管理器
定期檢查緩存狀態,看緩存總量是否超出限制,如果超出,就移除其中最少使用的部分
(2)緩存載入器
載入器只在nginx啟動後運行一次,把緩存內容的元數據信息載入到內存空間,如果一次性載入全部緩存信息,會大量消耗資源,使nginx在啟動後的幾分鍾里變慢,為避免此問題,有3種載入策略:
loader_threshold – 指定每次載入執行的時間
loader_files – 每次最多載入的數量
loader_sleeps – 每次載入的延時
例如:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
指定緩存哪些請求
nginx默認會緩存所有 get 和 head 方法的請求結果,緩存的key默認使用請求字元串
(1)自定義key
例如 proxy_cache_key " request_uri cookie_nocache arg_comment;
如果任何一個參數值不為空,或者不等於0,nginx就不會查找緩存,直接進行代理轉發
綜合示例
nginx 緩存機制
三分鍾看懂Nginx伺服器的緩存原理和機制