当前位置: > Linux服务器 > nginx >

nginx配置自动生成并保存缩略图

时间:2015-12-20 15:37来源:linux.it.net.cn 作者:IT
由于项目中的图片太多,而且同一张封面图在首页、列表页、详情页各自的尺寸都不统一,再加上项目有的是php写的,有的是java写的,所以最好的解决方法自然是能在nginx中搞定图片自动缩放,这样一来,项目中代码少了,心里也舒服了。

设想的缩略图自动生成方式还是跟原来差不多,比如有一张封面图的原始地址是:

 
 
1
http://file-server.xpker.com/image/20140613/LeACgMNQfV_!!1210x806.jpg

我们想在首页引用这张图,但是首页的列表小窗口尺寸是410×210,比例肯定跟原图肯定不一致,用img或者css的宽高属性去定义,结果就是没节操的缩放加拉伸,这绝对不是我们所想要的。我们设想,要把原图1210×806自动缩放到410×210,在比例不一致的情况下,只能允许裁剪,那么我们期望的自动裁剪调用方式如下:

 
 
 
1
http://file-server.xpker.com/image/20140613/LeACgMNQfV_!!1210x806.jpg_c410x220.jpg

 

约定c代表需要裁剪,r代表等比例缩放,所以后缀_c410x220.jpg的含义是,先将1210×806等比例缩放到410×273的样子(按最大宽高),再按居中位置把410×273裁剪成410×220,这样一来效果还不错。另外若后缀是_r410x220.jpg,则是讲1210×806等比例缩放到了330×220(按最小的宽高),非常方便,而且我们设想的是新的尺寸,在第一次访问自动生成的同时也把图片文件缓存下来,则第二次访问时,直接返回,就快很多了。

好了,基本也阐述清楚了,总之满足以上的需求的nginx配置如下:

(把图片格式的正则以及图片保存路径替换成自己的就可以了)

 

 
  
 
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
server {
    listen       80;
    server_name  shdyj.io;
     root /Users/Simon/tengine/html/shdyj-data/;
     access_log /Users/Simon/tengine/html/shdyj-data/nginx.log combined;
     index index.html index.htm;
     #charset koi8-r;
 
    #access_log  logs/host.access.log  main;
 
    #error_page  404              /404.html;
 
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
 
    location ~ ^\/image\/([0-9]+)\/([a-zA-Z]+_\!\![0-9]+x[0-9]+)\.(gif|jpg|jpeg|png|bmp)_([rc])([0-9]+)x([0-9]+)\.(gif|jpg|jpeg|png|bmp)$ {
    
        root /Users/Simon/tengine/html/shdyj-data/cache/;
      
        set $width $5;
        set $height $6;
        if ( $width = "0" ){
            set $width "-";
        }
        if ( $height = "0" ){
            set $height "-";
        }
        set $type $4;
        if ( $type = "r" ){
            set $type "resize";
        }
        if ( $type = "c" ){
            set $type "crop";
        }
         set $image_filename 'image/$1/$2.$3';
 
        #log_format  debug_log  '$request_filename --> $image_filename || $width || $height';
        #access_log logs/image_exsit.log combined;            
              
         proxy_set_header Host $host;
        proxy_store on;
        proxy_store_access user:rw group:rw all:r;
        #proxy_temp_path .;
        expires  30d;
        
         if ( !-f $request_filename) {
                proxy_pass http://127.0.0.1/image_$type/$image_filename?type=$type&width=$width&height=$height;
        }
    }
    location /image_resize {
        alias /Users/Simon/tengine/html/shdyj-data/;
        image_filter_jpeg_quality 85;
        image_filter resize $arg_width $arg_height;
        #access_log /Users/Simon/tengine/html/shdyj-data/logs/image_resize.log combined;
    }
    location /image_crop {
        alias /Users/Simon/tengine/html/shdyj-data/;
        image_filter crop $arg_width $arg_height;
        image_filter_jpeg_quality 85;
        #access_log /Users/Simon/tengine/html/shdyj-data/logs/image_crop.log combined;
    }
 
     location ~ ^\/image\/([0-9]+)\/([a-zA-Z]+_\!\![0-9]+x[0-9]+)\.(gif|jpg|jpeg|png|bmp)$ {
        expires 30d;
    }
 
 
}
 


(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容