這篇文章主要介紹“Nginx緩存Cache的配置方案及相關內(nèi)存占用問題怎么解決”,在日常操作中,相信很多人在Nginx緩存Cache的配置方案及相關內(nèi)存占用問題怎么解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Nginx緩存Cache的配置方案及相關內(nèi)存占用問題怎么解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
創(chuàng)新互聯(lián)建站是一家從事企業(yè)網(wǎng)站建設、成都網(wǎng)站設計、做網(wǎng)站、行業(yè)門戶網(wǎng)站建設、網(wǎng)頁設計制作的專業(yè)的建站公司,擁有經(jīng)驗豐富的網(wǎng)站建設工程師和網(wǎng)頁設計人員,具備各種規(guī)模與類型網(wǎng)站建設的實力,在網(wǎng)站建設領域樹立了自己獨特的設計風格。自公司成立以來曾獨立設計制作的站點近千家。
nginx緩存cache的5種方案
1、傳統(tǒng)緩存之一(404)
這個辦法是把nginx的404錯誤定向到后端,然后用proxy_store把后端返回的頁面保存。
配置:
location / {
root /home/html/;#主目錄
expires 1d;#網(wǎng)頁的過期時間
error_page 404 =200 /fetch$request_uri;#404定向到/fetch目錄下
}
location /fetch/ {#404定向到這里
internal;#指明這個目錄不能在外部直接訪問到
expires 1d;#網(wǎng)頁的過期時間
alias /html/;
proxy_store會將文件保存到這目錄下
proxy_pass//www.jb51.net/;#后端upstream地址,/fetch同時是一個代理
proxy_set_header accept-encoding '';#讓后端不要返回壓縮(gzip或deflate)的內(nèi)容,保存壓縮后的內(nèi)容會引發(fā)亂子。
proxy_store on;#指定nginx將代理返回的文件保存
proxy_temp_path /home/tmp;#臨時目錄,這個目錄要和/home/html在同一個硬盤分區(qū)內(nèi)
}使用的時候還有要注意是nginx要有權(quán)限往/home/tmp和/home/html下有寫入文件的權(quán)限,在linux下nginx一般會配置成nobody用戶運行,這樣這兩個目錄就要chown nobody,設成nobody用戶專用,當然也可以chmod 777,不過所有有經(jīng)驗的系統(tǒng)管理員都會建議不要隨便使用777。
2、傳統(tǒng)緩存之二(!-e)
原理和404跳轉(zhuǎn)基本一致,但更簡潔一些:
location / {
root /home/html/;
proxy_store on;
proxy_set_header accept-encoding '';
proxy_temp_path /home/tmp;
if ( !-f $request_filename )
{
proxy_pass//www.jb51.net/;
}
}可以看到這個配置比404節(jié)約了不少代碼,它是用!-f來判斷請求的文件在文件系統(tǒng)上存不存在,不存在就proxy_pass到后端,返回同樣是用proxy_store保存。
兩種傳統(tǒng)緩存都有著基本一樣的優(yōu)點和缺點:
缺點1:不支持帶參數(shù)的動態(tài)鏈接,比如read.php?id=1,因為nginx只保存文件名,所以這個鏈接只在文件系統(tǒng)下保存為read.php,這樣用戶訪問read.php?id=2時會返回不正確的結(jié)果。同時不支持//www.jb51.net/這種形式的首頁和二級目錄//www.jb51.net/download/,因為nginx非常老實,會將這樣的請求照鏈接寫入文件系統(tǒng),而這個鏈接顯然是一個目錄,所以保存失敗。這些情況都需要寫rewrite才能正確保存。
缺點2:nginx內(nèi)部沒有緩存過期和清理的任何機制,這些緩存的文件會永久性地保存在機器上,如果要緩存的東西非常多,那就會撐暴整個硬盤空間。為此可以使用一個shell腳本定期清理,同時可以撰寫php等動態(tài)程序來做實時更新。
缺點3:只能緩存200狀態(tài)碼,因此后端返回301/302/404等狀態(tài)碼都不會緩存,假如恰好有一個訪問量很大的偽靜態(tài)鏈接被刪除,那就會不停穿透導致后端承載不小壓力。
缺點4:nginx不會自動選擇內(nèi)存或硬盤作為存儲介質(zhì),一切由配置決定,當然在當前的操作系統(tǒng)里都會有操作系統(tǒng)級的文件緩存機制,所以存在硬盤上也不需要過分擔心大并發(fā)讀取造成的io性能問題。
nginx傳統(tǒng)緩存的缺點也是它和squid等緩存軟件的不同之特色,所以也可看作其優(yōu)點。在生產(chǎn)應用中它常常用作和squid的搭檔,squid對于帶?的鏈接往往無法阻擋,而nginx能將其訪問攔住,例如:http://jb51.net/?和http://jb51.net/在squid上會被當做兩個鏈接,所以會造成兩次穿透;而nginx只會保存一次,無論鏈接變成http://jb51.net/?1還是http://jb51.net/?123,均不能透過nginx緩存,從而有效地保護了后端主機。
nginx會非常老實地將鏈接形式保存到文件系統(tǒng)中,這樣對于一個鏈接,可以很方便地查閱它在緩存機器上的緩存狀態(tài)和內(nèi)容,也可以很方便地和別的文件管理器如rsync等配合使用,它完完全全就是一個文件系統(tǒng)結(jié)構(gòu)。
這兩種傳統(tǒng)緩存都可以在linux下將文件保存到/dev/shm里,一般我也是這么做的,這樣可以利用系統(tǒng)內(nèi)存來做緩存,利用內(nèi)存的話,清理過期內(nèi)容速度就會快得多。使用/dev/shm/時除了要把tmp目錄也指向到/dev/shm這個分區(qū)外,如果有大量小文件和目錄,還要修改一下這個內(nèi)存分區(qū)的inode數(shù)量和最大容量:
mount -o size=2500m -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm
上面的命令在一臺有3g內(nèi)存的機器上使用,因為/dev/shm默認最大內(nèi)存是系統(tǒng)內(nèi)存的一半就是1500m,這條命令將其調(diào)大成2500m,同時shm系統(tǒng)inode數(shù)量默認情況下可能是不夠用的,但有趣的是它可以隨意調(diào)節(jié),這里調(diào)節(jié)為480000保守了點,但也基本夠用了。
3、基于memcached的緩存
nginx對memcached有所支持,但是功能并不是特別之強,性能上還是非常之優(yōu)秀。
location /mem/ {
if ( $uri ~ "^/mem/([0-9a-za-z_]*)$" )
{
set $memcached_key "$1";
memcached_pass 192.168.1.2:11211;
}
expires 70;
}這個配置會將http://jb51.net/mem/abc指明到memcached的abc這個key去取數(shù)據(jù)。
nginx目前沒有寫入memcached的任何機制,所以要往memcached里寫入數(shù)據(jù)得用后臺的動態(tài)語言完成,可以利用404定向到后端去寫入數(shù)據(jù)。
4、基于第三方插件ncache
ncache是新浪兄弟開發(fā)的一個不錯的項目,它利用nginx和memcached實現(xiàn)了一部分類似squid緩存的功能,我并沒有使用這個插件的經(jīng)驗,可以參考:
http://code.google.com/p/ncache/
5、nginx新開發(fā)的proxy_cache功能
從nginx-0.7.44版開始,nginx支持了類似squid較為正規(guī)的cache功能,目前還處于開發(fā)階段,支持相當有限,這個緩存是把鏈接用md5編碼hash后保存,所以它可以支持任意鏈接,同時也支持404/301/302這樣的非200狀態(tài)。
配置:
首先配置一個cache空間:
復制代碼 代碼如下:
proxy_cache_path /path/to/cache levels=1:2 keys_zone=name:10m inactive=5m max_size=2m clean_time=1m;
注意這個配置是在server標簽外,levels指定該緩存空間有兩層hash目錄,第一層目錄是1個字母,第二層為2個字母,保存的文件名就會類似/path/to/cache/c/29/b7f54b2df7773722d382f4809d65029c;keys_zone為這個空間起個名字,10m指空間大小為10mb;inactive的5m指緩存默認時長5分鐘;max_size的2m是指單個文件超過2m的就不緩存;clean_time指定一分鐘清理一次緩存。
location / {
proxy_pass//www.jb51.net/;
proxy_cache name;#使用name這個keys_zone
proxy_cache_valid 200 302 1h;#200和302狀態(tài)碼保存1小時
proxy_cache_valid 301 1d;#301狀態(tài)碼保存一天
proxy_cache_valid any 1m;#其它的保存一分鐘
}ps:支持cache的0.7.44到0.7.51這幾個版本的穩(wěn)定性均有問題,訪問有些鏈接會出現(xiàn)錯誤,所以這幾個版本最好不要在生產(chǎn)環(huán)境中使用。nginx-0.7下目前所知較為穩(wěn)定的版本是0.7.39。穩(wěn)定版0.6.36版也是近期更新,如果在配置里沒有使用到0.7的一些新標簽新功能,也可以使用0.6.36版。
nginx緩存的內(nèi)存占用問題的一般解決方法
1、前些日子某服務被刷,每分鐘達到上幾百萬請求;當時采用了nginx cache來解決的;但是因為某服務不能緩存太久,當時設置了5s,那么帶來的問題就是產(chǎn)生大量小文件,而且很快就刪除了。
2、通過
free -m

會發(fā)現(xiàn)used是27g;但是通過top查看進程占的內(nèi)存并沒有那么多

那內(nèi)存去哪了?
3、通過查閱資料會發(fā)現(xiàn)(cat /proc/meminfo)
slab: 22464312 kb
sreclaimable: 16474128 kb (這些是內(nèi)核保持的但是可以釋放的inode和dentry的緩存)
sunreclaim: 5990184 kb
4、這些內(nèi)存為什么會不自動清理呢?
某機房機器系統(tǒng)版本:linux 2.6.32-431.el6.x86_64 #1 smp fri nov 22 03:15:09 utc 2013 x86_64 x86_64 x86_64 gnu/linux(正常,沒出現(xiàn)內(nèi)存快到100%的情況)
某機房機器系統(tǒng)版本:linux 2.6.32-279.el6.x86_64 #1 smp fri jun 22 12:19:21 utc 2012 x86_64 x86_64 x86_64 gnu/linux (不釋放)
5、通過設置如下參數(shù)來設置內(nèi)存閥值
sysctl -w vm.extra_free_kbytes=6436787 sysctl -w vm.vfs_cache_pressure=10000
到此,關于“Nginx緩存Cache的配置方案及相關內(nèi)存占用問題怎么解決”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
文章題目:Nginx緩存Cache的配置方案及相關內(nèi)存占用問題怎么解決
標題路徑:http://www.chinadenli.net/article36/iiigpg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App設計、電子商務、企業(yè)網(wǎng)站制作、小程序開發(fā)、網(wǎng)站維護、關鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)