nginx緩存cache的5種方案
1、傳統緩存之一(404)
這個辦法是把nginx的404錯誤定向到后端,然后用proxy_store把后端返回的頁面保存。
配置:
location / { root /home/html/;#主目錄 expires 1d;#網頁的過期時間 error_page 404 =200 /fetch$request_uri;#404定向到/fetch目錄下 } location /fetch/ {#404定向到這里 internal;#指明這個目錄不能在外部直接訪問到 expires 1d;#網頁的過期時間 alias /html/; proxy_store會將文件保存到這目錄下 proxy_pass//www.49028c.com/;#后端upstream地址,/fetch同時是一個代理 proxy_set_header Accept-Encoding '';#讓后端不要返回壓縮(gzip或deflate)的內容,保存壓縮后的內容會引發亂子?! roxy_store on;#指定nginx將代理返回的文件保存 proxy_temp_path /home/tmp;#臨時目錄,這個目錄要和/home/html在同一個硬盤分區內 }
使用的時候還有要注意是nginx要有權限往/home/tmp和/home/html下有寫入文件的權限,在linux下nginx一般會配置成nobody用戶運行,這樣這兩個目錄就要chown nobody,設成nobody用戶專用,當然也可以chmod 777,不過所有有經驗的系統管理員都會建議不要隨便使用777。
2、傳統緩存之二(!-e)
原理和404跳轉基本一致,但更簡潔一些:
location / { root /home/html/; proxy_store on; proxy_set_header Accept-Encoding ''; proxy_temp_path /home/tmp; if ( !-f $request_filename ) { proxy_pass//www.49028c.com/; } }
可以看到這個配置比404節約了不少代碼,它是用!-f來判斷請求的文件在文件系統上存不存在,不存在就proxy_pass到后端,返回同樣是用proxy_store保存。
兩種傳統緩存都有著基本一樣的優點和缺點:
缺點1:不支持帶參數的動態鏈接,比如read.php?id=1,因為nginx只保存文件名,所以這個鏈接只在文件系統下保存為read.php,這樣用戶訪問read.php?id=2時會返回不正確的結果。同時不支持//www.49028c.com/這種形式的首頁和二級目錄//www.49028c.com/download/,因為nginx非常老實,會將這樣的請求照鏈接寫入文件系統,而這個鏈接顯然是一個目錄,所以保存失敗。這些情況都需要寫rewrite才能正確保存。
缺點2:nginx內部沒有緩存過期和清理的任何機制,這些緩存的文件會永久性地保存在機器上,如果要緩存的東西非常多,那就會撐暴整個硬盤空間。為此可以使用一個shell腳本定期清理,同時可以撰寫php等動態程序來做實時更新。
缺點3:只能緩存200狀態碼,因此后端返回301/302/404等狀態碼都不會緩存,假如恰好有一個訪問量很大的偽靜態鏈接被刪除,那就會不停穿透導致后端承載不小壓力。
新聞熱點
疑難解答