nginx 圖片緩存


最近准備用nginx搭建了一個圖片服務器,看中的就是nginx超強的靜態文件處理能力。


由於圖片量比較大,和web服務器(也是nginx)分開運行,雖然web服務器調用圖片沒用問題,但畢竟是遠程調用,肯定沒有本地文件系統那么快,因此仍然有優化的空間。


使用前的nginx配置

location ~* ^.+\.(js|ico|gif|jpg|jpeg|png|html|htm)$ {
    log_not_found off;
    access_log off;
    expires 7d;
}

 

   
接下來就用到了nginx的proxy_store模塊,讓nginx 將取得的圖片緩存在本地一個目錄,下次就直接調用,(這讓網頁熱點圖片統計變得非常容易,討厭日志分析的管理員肯定喜歡)
 
 
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|html|htm|css)$ {
           log_not_found off;
           expires 7d ;
           access_log off;
           proxy_store on;
           proxy_store_access user:rw group:rw all:rw;
            if ( !-e $request_filename) {
           proxy_pass  http://img.example.com
           }
}

默認的緩存路徑位於 /var/cache/nginx/proxy_temp,里面將會保持圖片服務器的目錄結構

 

proxy_store 沒有緩存過期,相當於鏡像功能,這既是優點也是缺點,優點是訪問快速,缺點是不知哪一天,硬盤會被撐爆,不過我們可以寫個find腳本,定時清理一下緩存就OK了。

 

nginx還有一種緩存proxy_cache,它在設計上比proxy_store 更先進,采用內存+硬盤方式緩存,可以設置緩存大小和緩存過期。

http {
    ,,,,,
    proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=imgcache:100m inactive=1d max_size=10g;
    server {
    ........
        location ~* ^.+\.(js|ico|gif|jpg|jpeg|png|html|htm)$ {
        log_not_found off;
        access_log off;
        expires 7d;
        proxy_pass http://img.example.com ;
        proxy_cache imgcache;
        proxy_cache_valid 200 302 1d;
        proxy_cache_valid 404 10m;
        proxy_cache_valid any 1h;
        proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
        }
    }
}
   

上面的代碼將會使用一塊最大100M的共享內存,用於硬盤上的文件索引,包括文件名和請求次數,每個文件在1天內若不活躍(無請求)則從硬盤上淘汰,硬盤緩存最大10G,滿了則根據LRU算法自動清除緩存。


這種緩存方式為了更快的索引,采用hash分級來存儲圖片,圖片目錄結構和名稱都變得面目全非,因此網頁熱點圖片,必須通過其他途徑統計,比如日志。


后一種方式更像一種正兒八經的緩存系統,應用相對更廣,在性能上也更好。

 

文章轉載自:http://purplegrape.blog.51cto.com/1330104/1205129


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM