您的位置:首页 > 运维架构 > Nginx

[Nginx]使用nginx的image_filter_module来处理图片

2015-07-16 12:07 766 查看
我司APP针对不同尺寸的手机需要展示不同尺寸的图片;同时,在App的不同功能模块中,图片展示的大小也不同。然而,旅游线路上传之初,图片只存在一种适用于网站的尺寸,所以这就导致以下问题:
1,图片过大导致 APP加载图片速度慢;
2,消耗用户过多流量;
等等。所以,针对服务器图片处理的解决方案迫在眉睫。
Nginx中的image_filter_module为上述场景提供了可行的方法,本文就此作详细的介绍

一,思路:
1,app请求图片,并提供图片的尺寸信息,nginx拦截请求后,处理并缓存图片;
2,当app下次请求同样的图片时,nginx直接取缓存中的图片返回给app。

二,Nginx图片处理流程图



三,Nginx image_filter_module 配置部署说明:

nginx_http_image_filter_module在nginx 0.7.54以后才出现的,用于对JPEG, GIF和PNG图片进行转换处理
这个模块默认不被编译,所以要在编译nginx源码的时候,加入相关配置信息

-----------编译与安装-------
下载nginx最新版本
$ curl http://nginx.org/download/nginx-1.8.0.tar.gz |tar
-xzf -
添加nginx 配置信息
$ ./configure —-user=web —-group=web —prefix=/home/web/nginx--with-http_stub_status_module
--without-http-cache --with-http_ssl_module --with-http_image_filter_module
make!
$ make && make install

开启nginx 服务
$ /home/web/nginx/sbin/nginx

以上四步下载最新的nginx源码,并解压到相应文件夹,然后进入该文件夹,
用./configure添加配置信息(配置中设定这个nginx的用户是web,安装目录是/home/web/nginx),用make编译源码。最后开启nginx服务,如果没出错的话,打开浏览器,输入http://ip 可以看到如下信息



———————————配置-------------
对nginx功能最基本的定义,都来自于/home/web/nginx/conf/nginx.conf这个文件
我们这里在nginx.conf 包含了 “site_enabled/“这个文件夹,并在site_enabled下创建default文件,用于配置服务器的功能,下面直接贴重要配置信息,并赋予注释

# 匹配满足 下面正则表达式的URI。若匹配,进入该功能段
location ~* "^(/static/upload/images)/([\d-]+)/(.*)\.(jpe?g|png)_(\d+)x(\d+)$"{
# 提取正则表达式中的参数,赋给有意义的变量
set $dir $2; #以日期命名的文件夹
set $width $5; #图片的宽
set $height $6; #图片的高
set $dimens "_$5x$6”; #图片纬度信息
set $reImage_name "$3$dimens.$4”; #给图片重命名 xxx_w*h.jpg
set $image_name "$3.$4”; #图片原始名称

# 重定义图片URI,因为图片的存放位置与访问URI不一致,历史问题
alias /data/nginx/resize_images/$dir/$reImage_name;

# 定义image_uri
set $image_uri image_resize/$dir/$image_name?width=$width&height=$height;

# 判断访问的图片是否存在
# 若不存在,proxy_pass到 location /image_resize 进行图片处理

if (!-f $request_filename) {
proxy_pass http://127.0.0.1:82/$image_uri; break;
}

# 若执行了 proxy_pass,则下面四句都是为了保存处理后的图片,以备日后的访问

proxy_store /data/nginx/resize_images/$dir/$reImage_name;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /data/images;
proxy_set_header Host $host;

#访问日志路径

access_log logs/store.access.log;
}

# 匹配满足 /image_resize的URI,都是来自上面的location
location /image_resize {
#access_log logs/image_resize.log;

#重定义 访问URI
alias /data/alidata4/files_opt/static/upload/images/;

# 根据参数,resize 找到的图片
image_filter resize $arg_width $arg_height;
image_filter_jpeg_quality 75;

# 禁止外网的访问,只允许本地访问
allow 127.0.0.0/8;
deny all;
}
参考:
1,从源码编译 nginx
2,nginx配置入门介绍
3,如何控制nginx
4,nginx如何处理http请求
5,nginx的proxy_module(代理模块)
6,nginx的image_filter_module
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: