閱讀206 返回首頁    go 中電雲集


nginx緩存cache的幾種方式

nginx緩存cache的幾種方式

官方詳細參數:https://wiki.nginx.org/NginxHttpProxyModule

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 /home/html/;#虛擬目錄文件係統地址要和locaion /一致,proxy_store會將文件保存到這目錄下
proxy_pass https://xok.la/;#後端upstream地址,/fetch同時是一個代理
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。

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 https://xok.la/;
}
}

可以看到這個配置比404節約了不少代碼,它是用!-f來判斷請求的文件在文件係統上存不存在,不存在就proxy_pass到後端,返回同樣是用proxy_store保存。

兩種傳統緩存都有著基本一樣的優點和缺點:
缺點1:不支持帶參數的動態鏈接,比如read.php?id=1,因為nginx隻保存文件名,所以這個鏈接隻在文件係統下保存為read.php,這樣用戶訪問read.php?id=2時會返回不正確的結果。同時不支持https://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能將其訪問攔住,例如:https://xok.la/?https://xok.la/在squid上會被當做兩個鏈接,所以會造成兩次穿透;而nginx隻會保存一次,無論鏈接變成https://xok.la/?1還是https://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

上麵的命令在一台有3G內存的機器上使用,因為/dev/shm默認最大內存是係統內存的一半就是1500M,這條命令將其調大成2500M,同時 shm係統inode數量默認情況下可能是不夠用的,但有趣的是它可以隨意調節,這裏調節為480000保守了點,但也基本夠用了。

3、基於memcached的緩存

nginx對memcached有所支持,但是功能並不是特別之強,性能上還是非常之優秀。

location /mem/ {
if ( $uri ~ “^/mem/([0-9A-Za-z_]*)$” )
{
set $memcached_key “$1″;
memcached_pass 192.168.6.2:11211;
}
expires 70;
}

這個配置會將https://xok.la/mem/abc指明到memcached的abc這個key去取數據。

nginx目前沒有寫入memcached的任何機製,所以要往memcached裏寫入數據得用後台的動態語言完成,可以利用404定向到後端去寫入數據。

4、基於第三方插件ncache

ncache是新浪兄弟開發的一個不錯的項目,它利用nginx和memcached實現了一部分類似squid緩存的功能,我並沒有使用這個插件的經驗,可以參考:

https://code.google.com/p/ncache/

5、nginx新開發的proxy_cache功能

從nginx-0.7.44版開始,nginx支持了類似squid較為正規的cache功能,目前還處於開發階段,支持相當有限,這個緩存是把鏈接用md5編碼hash後保存,所以它可以支持任意鏈接,同時也支持404/301/302這樣的非200狀態。

配置:

首先配置一個cache空間:

proxy_cache_path /xok/to/cache levels=1:2 keys_zone=xok1:10m inactive=5m max_size=2m clean_time=1m;

proxy_temp_path參數路徑也需要跟上麵的proxy_cache_path在一個分區上,否則會報錯。

注意這個配置是在server標簽外,levels指定該緩存空間有兩層hash目錄,第一層目錄是1個字母,第二層為2個字母,保存的文件名就會類似 /xok/to/cache/e/4a/0f1019b0db2f97d17c2238c0271a74ae;keys_zone為這個空間起個名字,10m指空間大小為10MB;inactive的5m指緩存默認時長5分鍾;max_size的2m是指單個文件超過2m的就不緩存;clean_time指定一分鍾清理一次緩存。

location / {
proxy_pass https://xok.la/;

proxy_cache xok1;#使用xok1這個keys_zone

proxy_cache_valid 200 302 1h;#200和302狀態碼保存1小時
proxy_cache_valid 301 1d;#301狀態碼保存一天
proxy_cache_valid any 1m;#其它的保存一分鍾
}

綜合起來可以簡單優化靜態文件:

location ~ .*\.(js|css|gif|jpg|jpeg|png|bmp|swf|flv)$
{
proxy_pass https://backend;
expires 6h; #設置瀏覽器過期時間
proxy_cache xok1;#使用xok1這個keys_zone

proxy_cache_valid 200 302 1h;#200和302狀態碼保存1小時
proxy_cache_valid 301 1d;#301狀態碼保存一天
proxy_cache_valid any 1m;#其它的保存一分鍾
}

注意:支持cache的0.7.44到0.7.51這幾個版本的穩定性均有問題,訪問有些鏈接會出現錯誤,所以這幾個版本最好不要在生產環境中使用。 nginx-0.7下目前所知較為穩定的版本是0.7.39。穩定版0.6.36版也是近期更新,如果在配置裏沒有使用到0.7的一些新標簽新功能,也可以使用0.6.36版。

最後更新:2017-01-04 22:34:55

  上一篇:go DDoS拒絕服務攻擊和安全防範技術
  下一篇:go 服務器相關基礎知識五問答