最近准備用nginx搭建了一個圖片服務器,看中的就是nginx超強的靜態文件處理能力。
由於圖片量比較大,和web服務器(也是nginx)分開運行,雖然web服務器調用圖片沒用問題,但畢竟是遠程調用,肯定沒有本地文件系統那么快,因此仍然有優化的空間。
使用前的nginx配置
location ~* ^.+\.(js|ico|gif|jpg|jpeg|png|html|htm)$ {
log_not_found off;
access_log off;
expires 7d;
}
|
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