最近準備用nginx搭建了一個圖片服務器,看中的就是nginx超強的靜態文件處理能力。
由于圖片量比較大,和web服務器(也是nginx)分開運行,雖然web服務器調用圖片沒用問題,但畢竟是遠程調用,肯定沒有本地文件系統那么快,因此仍然有優化的空間。
proxy_store
使用前的nginx配置
1
2
3
4
5
|
location ~* ^.+\.(js|ico|gif|jpg|jpeg|png|html|htm)$ { log_not_found off; access_log off; expires 7d; } |
接下來就用到了nginx的proxy_store模塊,讓nginx 將取得的圖片緩存在本地一個目錄,下次就直接調用,(這讓網頁熱點圖片統計變得非常容易,討厭日志分析的管理員肯定喜歡)
1
2
3
4
5
6
7
8
9
10
|
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 更先進,采用內存+硬盤方式緩存,可以設置緩存大小和緩存過期。
proxy_cache
proxy_cache有一個問題就是,proxy_cache不能清除指定的URL緩存,只能設置URL過期時間,但是有問題,有人就會很快解決問題,nginx第三方模塊ngx_cache_purge能清除指定URL。
nginx安裝時需要將ngx_cache_purege加載進去。
1
|
./configure --user=www --group=www --add-module=/root/dxm/nginx/ngx_cache_purge-1.2 |
其中,/root/dxm/nginx/ngx_cache_purge-1.2為ngx_cache_purge解壓路徑(附件中提供ngx_cache_purge tar包下載)
現在來一段實例,實現圖片緩存:
話說proxy_tem_path,與proxy_cache_path必須在同一個分區之下!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
proxy_temp_path /usr/local/nginx/proxy_temp; proxy_cache_path /usr/local/nginx/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=1g; upstream tomcat_server{ server 127.0.0.1:8080; } server{ listen 192.168.154.128; server_name www.jfrwli.cn; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { proxy_cache cache_one; proxy_cache_methods GET HEAD POST; proxy_cache_min_uses 1; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid any 1m; proxy_cache_key "$host:$server_port$uri$is_args$args"; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://tomcat_server; } location ~ .*\.(jsp)$ { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://tomcat_server; } location ~ /purge(/.*) { allow 192.168.154.128; allow 192.168.154.1; deny all; proxy_cache_purge cache_one $host:$server_port$1$is_args$args; } |
恩,靜態頁面緩存,動態請求不緩存!
大家看一下最后一段的那個purege配置,很顯然,表示哪些IP可以手動清除指定的URL
比如,www.jfrwli.cn/1.jpg可以訪問到我的圖片,那么用www.aspku.net/purge/1.jpg 就可以清除圖片緩存了。