首頁  >  文章  >  後端開發  >  Nginx快取整理

Nginx快取整理

WBOY
WBOY原創
2016-08-08 09:22:271173瀏覽

nginx快取cache的幾種方式

1、nginx的proxy_cache功能從nginx-0.7.44版開始,nginxx支持了類似的正規功能。這個快取是把連結用md5編碼hash後儲存,所以它可以支援任意連結,同時也支援404/301/302這樣的非200狀態。 設定:先設定一個cache空間(在http之下):姆3/ache>gache>gache>gache> 5m max_size =1g clean_time=1m;proxy_temp_path參數路徑也需要跟上面的proxy_cache_path在一個分割區上,否則會報錯。 注意這個配置是在server標籤外,levels指定該快取空間有兩層hash目錄,第一層目錄是1個字母,第二層為2個字母,保存的檔案名稱就會類似/xok /to/cache/e/4a/0f1019b0db2f97d17c2238c0271a74ae;keys_zone為這個空間取個名字,50m指共享記憶體空間大小為50MB,即記憶體快取空間(活躍);inactive的5m指快取時長51g;指總的快取空間大小為1g,磁碟快取空間,當快取總大小超過該值,將執行lru策略;clean_time指定一分鐘清理一次快取。  location / {    proxy_pass http://xok.la/;   proxy_cache_valid 200 302 1h;#200和302狀態碼保存1小時    proxy_cache_valid 301 1d;#301狀態碼保存一天    proxy_cache_valid any :

location ~ ^/(xx|yy).action{
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host; X-Forwarded -For $proxy_add_x_forwarded_for;
add_header X-Cache $upstream_cache_status; 
//看解釋1
proxy_cache_dream_cache ectId;//看解釋2
proxy_cache_methods GET POST;
proxy_cache_valid 200 301 302 5s;pro_cache_httpstale errortime
//看解釋3
proxy_cache_lock on;
//看解釋4 proxy_cache_lock_timeout 5s;
proxy_pass http://localhost;}
解釋1:
add_header X-Cache $uppse-Cachep.

nginx提供了$upstream_cache_status這個變數來顯示快取的狀態,我們可以在設定中加入一個http頭來顯示這個狀態,達到類似squid的效果。


$upstream_cache_status包含以下幾種狀態: ·MISS 未命中,請求被傳送到後端 

·UPDATING 正在更新緩存,將使用舊的應答 ·STALE 後端將得到過期的應答

proxy_cache_key $host$ uri$is_args$arg_pageNo$arg_subjectId;指定了快取的key,通常是url。這裡要注意兩個變數:

(1)$is_args'?'問號

(2)$args;問問號後面的所有參數

(2)$args;問問號後面的所有參數

認為更需要懂得,這是指定部分參數的寫法,pageNo、和subjectId兩個參數,而忽略其他的參數,例如遇到有加時間戳的時候,可以忽略掉時間戳,否則緩存永遠不會命中的。


解釋3:

proxy_cache_use_stale proxy_cache_use_stale

proxy_cache_use_stale

proxy_cache_use_stale

proxy_cache_use_stale

proxy_cache_use_stale 指定後端伺服器出現什麼狀況時,nginx可以使用的過期緩存。
比如製定了updating,它將保證只有一個線程去更新緩存,並且在這個線程更新緩存的過程中其他的線程只會響應當前緩存中的過期版本。

解釋4:

proxy_cache_lockonon; #定義相同的請求,同時只允許一個請求發送到後端,並根據proxy_cache_key往記憶體中寫新

#條目,直接proxy_cache_lock_time超時被釋放

proxy_cache_lock on |off #defobd ache

接下來附上一些介紹:

1 proxy_cache語法_cache zone_names;區域可以在不同的地方使用。 在0.7.48後,快取遵循後端的”Expires”, “Cache-Control: no-cache”, “Cache-Control: max-age=XXX”等等。然而,目前nginx會忽略一些快取控制指令,如:”private”和”no-store”,同樣,nginx在快取過程中不會處理”Vary”頭,為了確保一些私有資料不被所有的使用者看到,後端必須設定「no-cache」或」max-age=0″頭,或proxy_cache_key包含使用者指定的資料如$http_cookie_xxx,在proxy_cache_key中使用一部分cookie的值可以防止快取私有數據,所以可以分別指定location以便分開私有資料和公有資料。 快取指令依賴代理緩衝區(buffers),如果proxy_buffers設定為off,快取不會生效。 2 proxy_cache_key

語法:proxy_cache_key line;
預設值:$scheme$proxy_host$request_uri;
使用欄位:http, server, location
指令指定了包含在快取中的快取關鍵字。

proxy_cache_key "$host$request_uri$cookie_user";
proxy_cache_key "$scheme$host$request_uri";

3 proxy_cache_path

語法:proxy_cache_ [levels=number] keys_z [inm=time] [maxsizesizes; 指令指定緩存的路徑和一些其他參數,快取的資料儲存在檔案中。快取的檔案名稱和key為代理URL的MD5 碼。 levels參數指定快取的子目錄數,例如:
proxy_cache_path /data/nginx/cache levels=1:2 keys_z/td>
檔案名稱類似於:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029ckey ,這個區域用keys_zone參數指定,如果在inactive參數指定的時間內快取的資料沒有被要求則被刪除,預設inactive為10分鐘。

cache manager進程控制磁碟的快取大小,在max_size參數中定義,超過其大小後最少使用資料將被刪除。 區域的大小按照快取頁數的比例進行設置,一個頁面(檔案)的元資料大小按照作業系統來定,FreeBSD/i386下為64字節,FreeBSD/amd64下為128字節,當區域滿了以後key將按照LRU(最近最少使用演算法)進行處理。 proxy_cache_path和proxy_temp_path應該使用在相同的檔案系統上。 4 proxy_cache_methods語法:proxy_cache_methods [GET HEAD POST];

默認值:proxy_cache_methods GET HEAD;使用字段:http, server, location

GET/HEAD用來裝飾語句,即你無法禁用GET /HEAD即使你只使用下列語句設定:

proxy_cache_methods POST;


5 proxy_cache_min_uses

語法:proxy_cache_min_uses the_numberdsg;

多少次的查詢後應答將被緩存,預設1。

6 proxy_cache_valid

語法:proxy_cache_valid reply_code [reply_code ...] time;預設值:None使用欄位:http, server, loreegoled為不同的時間的時間7 proxy_cache_use_stale

為了防止緩存失效(在多個線程同時更新本地緩存時),你可以指定'updating'參數,它將保證只有一個線程去更新緩存,並且在這個線程更新緩存的過程中其他的執行緒只會回應目前快取中的過期版本。




程式碼及configure配置:


。在configure的時候只需要把「HTTP_CACHE」設定為YES(可以找到auto/options裡面HTTP_CACHE那行)。 “proxy_cache_purge”指令需要下載nginx add-ons裡面的「Cache Purge」模組,並在configure的時候用"--add-module="來載入程式碼。

以下附件一些其他nginx快取內容,但是現在很少使用了,有興趣可以了解下:二、傳統快取之一(404)這個辦法是把nginx的404錯誤定向到後端,然後用proxy_store把後端回傳的頁面保存。     location / {    root /home/html/;#主目錄    expires 1d; request_uri;#404定向到/fetch目錄下    }    location /fetch/ {#404導向到這裡    internal;#此目錄目錄此目錄    internal;# 指定這個目錄目錄    alias / home/html/;#虛擬目錄檔案系統位址要和locaion /一致,proxy_store會將檔案儲存到這個目錄下    proxy_pass http://xok.la/;#後端upstream是一個代理    proxy_set_header Accept-Encoding '';#讓後端不要返回壓縮(gzip或deflate)的內容,保存壓縮後的內容會引發亂子。     proxy_store on;#指定nginx將代理回傳的檔案保存    proxy_temp_path /home/tmp;#臨時目錄,此目錄要和/home/html }使用的時候還有要注意是nginx要有權限往/home/tmp和/home/html下有寫入檔案的權限,在linux下nginx一般會配置成nobody用戶運行,這樣這兩個目錄就要chown nobody,設為nobody用戶專用,當然也可以chmod 777,不過所有有經驗的系統管理員都會建議不要隨便使用777。三、傳統緩存之二(!-e)原理與404跳轉基本上一致,但更簡潔一些:     proxy_store on;    proxy_set_header Accept-Encoding '';    proxy_temp_path /home/tmp;     {    proxy_pass http://xok. la/;    }    }可以看到這個配置比404節約了不少代碼,它是用!-f來請求的文件在文件系統上存不存在,就proxy_pass到後端,回傳同樣是用proxy_store保存。 兩種傳統快取都有基本一樣的優點和缺點:缺點1:不支援帶參數的動態連結,比如read.php?id=1,因為nginx只保存檔案名稱,所以這個連結只在檔案系統下儲存為read.php,這樣使用者存取read.php?id=2時會傳回不正確的結果。同時不支援http://xok.la/這種形式的首頁和二級目錄http: //xok.la/download/,因為nginx非常老實,會將這樣的請求照連結寫入檔案系統,而這個連結顯然是一個目錄,所以保存失敗。這些情況都需要寫rewrite才能正確保存。 缺點2:nginx內部沒有緩存過期和清理的任何機制,這些緩存的文件會永久性地保存在機器上,如果要緩存的東西非常多,那就會撐暴整個硬碟空間。為此可以使用一個shell腳本定期清理,同時可以撰寫php等動態程式來做即時更新。 缺點3:只能緩存200狀態碼,因此後端返回301/302/404等狀態碼都不會緩存,假如恰好有一個訪問量很大的偽靜態鏈接被刪除,那就會不停穿透導致後端承載不小壓力。缺點4:nginx不會自動選擇內存或硬碟作為存儲介質,一切由配置決定,當然在當前的操作系統裡都會有操作系統級的文件緩存機制,所以存在硬碟上也不需要過分擔心大並發讀取造成的io效能問題。 nginx 傳統快取的缺點也是它和squid等快取軟體的不同之特色,所以也可看作其優點。在生產應用中它常常用作和squid的搭檔,squid 對於帶?的鏈接往往無法阻擋,而nginx能將其訪問攔住,例如:http://xok.la/?和http:// xok.la/在squid上會被當做兩個連結,所以會造成兩次穿透;而nginx只會保存一次,無論連結變成http://xok.la/?1還是http: //xok.la/?123,皆不能透過nginx快取,從而有效地保護了後端主機。 nginx會非常老實地將連結形式保存到檔案系統中,這樣對於一個連結,可以很方便地查閱它在快取機器上的快取狀態和內容,也可以很方便地和別的文件管理器如rsync等配合使用,它完完全全就是一個檔案系統結構。 這兩種傳統快取都可以在linux下將檔案保存到/dev/shm裡,一般我也是這麼做的,這樣可以利用系統記憶體來做快取,利用記憶體的話,清理過期內容速度就會快得多。使用/dev/shm/時除了要把tmp目錄也指向到/dev/shm這個分區外,如果有大量小檔案和目錄,還要修改一下這個記憶體分區的 inode數量與最大容量:    mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm noatime,nodiratime -o remount /dev/shm ,因為/dev/shm默認最大內存是系統內存的一半就是1500M,這條命令將其調大成2500M,同時shm系統inode數量默認情況下可能是不夠用的,但有趣的是它可以隨意調節,這裡調節為480000保守了點,但也基本夠用了。 四、基於memcached的快取🎜nginx對memcached有所支援,但是功能並不是特別之強,性能上還是非常之優秀。    location /mem/ {    if ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )🠎 "$1" ;    memcached_pa​​ss 192.168.6.2:11211;    }    expires 70;會將http://xok.la/mem/abc指明到memcached的abc這個key去取資料。 nginx目前沒有寫入memcached的任何機制,所以要往memcached裡寫入資料得用後台的動態語言完成,可以利用404定向到後端去寫入資料。 五、基於第三方插件ncachencache是​​新浪兄弟開發的一個不錯的項目,它利用nginx和memcached實現了一部分類似squid緩存的功能,我並沒有使用這個插件的經驗,可以參考:http://code.google.com/p/ncache/ 以上就介紹了Nginx快取整理,包括了方面的內容,希望對PHP教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn