nginx本身有支持图片处理的模块,通过外部插件也可以实现此功能。
libgd的安装
前提是要有libgd的库文件,
(1)去官网访问主页没问题,下载文件还是*下的,为了方便大家提供一个链接:http://files.cnblogs.com/files/bugutian/libgd-2.1.1.tar
使用起来就是解压:
tar -vxf libgd-2.1..tar
cd libgd-2.1.
./configure
make
make install
就行了。如果启动nginx的时候还报找不到动态库,那就自己find一下,然后
export LD_LIBRARY_PATH=/Path/to/libgd.so:$LD_LIBRARY_PATH
在启动,或者把路径写到系统的环境变量也行。
(2)当然也还有更简单的方法,直接yum安装也行,自己配置好yum源,然后:
yum install gd-devel pcre-devel libcurl-devel
因为libcurl也是需要的一部分,所以一起安装。
相对的编译也会简单,可以不用下面那么麻烦。
./configure --prefix=/usr/local/nginx --with-pcre --add-module=../ngx_image_thumb-master
make
make install
按下面的方法配置即可。
一、with-http_image_filter_module模块安装
编译过程很简单
#./configure --prefix=./ --with-http_image_filter_module --with-pcre=../pcre-8.36
#make
#make install
一般情况下,nginx一般都需要用到正则表达式,所以对于图片处理器pcre就更不能少了,如果有pcre,我们的配置就可以写成下面这样:
location ~* /images/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ {
set $h $;
set $w $;
if ($h = "") {
rewrite /images/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ /images/$.$ last;
}
if ($w = "") {
rewrite /images/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ /images/$.$ last;
}
#根据给定的长宽生成缩略图
image_filter resize $h $w;
#原图最大2M,要裁剪的图片超过2M返回415错误,需要调节参数image_filter_buffer
image_filter_buffer 2M;
#error_page /images/notfound.jpg;
try_files /images/$.$ /images/notfound.jpg;
}
可以完成图片请求的自适应,如果没有,我们只能像下面这样,把缩略图的尺寸定死。
location ~ /{
#proxy_pass http://10.11.11.11;
image_filter resize ;
error_page = /empty;
}
(如果系统安装了pcre这个参数可以省略,因为高版本的nginx默认是安装了pcre的),图片处理就更不能少了,其他配置都是通用的。
二、ngx_image_thumb-maste的安装
当然上面的模块可以用,但是自适应性让人看着并不爽。而另一款插件ngx_image_thumb-maste配置起来就好用多了
源码地址:https://github.com/3078825/nginx-image/archive/master.zip
编译安装:
# ./configure --prefix=./ --add-module=../ngx_image_thumb-master --with-pcre=../pcre-8.36
# make
# make inatll
配置也不那么复杂,支持的功能也多
location / {
root html;
index index.html index.htm;
image on;
image_output on;
image_water on;
image_water_type ;
image_water_file "/usr/local/nginx/html/vanke.png";
image_water_pos ;
image_water_min ;
#image_water_text Vanke.com;
#image_water_font_size ;
}
image on/off 是否开启缩略图功能,默认关闭
image_backend on/off 是否开启镜像服务,当开启该功能时,请求目录不存在的图片(判断原图),将自动从镜像服务器地址下载原图
image_backend_server 镜像服务器地址
image_output on/off 是否不生成图片而直接处理后输出 默认off
image_jpeg_quality 75 生成JPEG图片的质量 默认值75
image_water on/off 是否开启水印功能
image_water_type 0/1 水印类型 0:图片水印 1:文字水印
image_water_min 300 300 图片宽度 300 高度 300 的情况才添加水印
image_water_pos 0-9 水印位置 默认值9 0为随机位置,1为顶端居左,2为顶端居中,3为顶端居右,4为中部居左,5为中部居中,6为中部居右,7为底端居左,8为底端居中,9为底端居右
image_water_file 水印文件(jpg/png/gif),绝对路径或者相对路径的水印图片
image_water_transparent 水印透明度,默认20
image_water_text 水印文字 "Power By Vampire"
image_water_font_size 水印大小 默认 5
image_water_font 文字水印字体文件路径
image_water_color 水印文字颜色,默认 #000000
这里假设你的nginx 访问地址为 http://192.168.0.2:8082/
并在nginx网站根目录存在一个 test.jpg 的图片
通过访问
http://192.168.0.2:8082/test.jpg!c300x200.jpg 将会 生成/输出 test.jpg 300x200 的缩略图
其中 c 是生成图片缩略图的参数, 300 是生成缩略图的宽度, 200 是生成缩略图的高度
一共可以生成四种不同类型的缩略图。
支持 jpeg / png / gif (Gif生成后变成静态图片)
C 参数按请求宽高比例从图片高度 10% 处开始截取图片,然后缩放/放大到指定尺寸( 图片缩略图大小等于请求的宽高 )
M 参数按请求宽高比例居中截图图片,然后缩放/放大到指定尺寸( 图片缩略图大小等于请求的宽高 )
T 参数按请求宽高比例按比例缩放/放大到指定尺寸( 图片缩略图大小可能小于请求的宽高 )
W 参数按请求宽高比例缩放/放大到指定尺寸,空白处填充白色背景颜色( 图片缩略图大小等于请求的宽高
参照上面的配置,也有以下的写法
http://192.168.0.2:8082/test.c300x300.jpg
http://192.168.0.2:8082/test.t300x300.jpg
http://192.168.0.2:8082/test.m300x300.jpg
http://192.168.0.2:8082/test.w300x300.jpg
http://192.168.0.2:8082/test.jpg!c300x300.jpg
http://192.168.0.2:8082/test.jpg!t300x300.jpg
http://192.168.0.2:8082/test.jpg!m300x300.jpg
http://192.168.0.2:8082/test.jpg!w300x300.jpg
但是这个模块当然也有缺点,大量的图片处理肯定很耗费cpu和内存,所以在这个服务器前一定要配个缓存服务器,第二个就是容易遭到攻击,因为可以支持缩放,所以黑客可以故意用很大的尺寸来请求小图片,这样将非常耗费服务器的存储,尤是图片命名规则一看就清楚的网站和图片名称容易被爬取的网站更容易被攻击。而第一个模块因为可以设置缓存大小,可以稍做限制。
当然此模块代码不多,可以通过修改源码的方式,解决上面的问题。
但在实践过程中,发现在并发的情况下(ngx_imgthumb不经过反向代理)直接应对请求,如果图片比较大,会出现nginx报signal 11的情况。
当然具体的配置还是要参考官网:https://github.com/oupula/ngx_image_thumb/blob/master/README_EN.md
比如,配置之后发现如果图片不存在,本应返回404但是却响应很慢。这样就可以配置:
image_backend off;
image_backend_server http://baidu.com/docs/aabbc.png;
配置一个不存在的地址,是因为他代码里面的off不起作用。