一、安装perl依赖库
yum -y install perl-ExtUtils-Embed
二、nginx配置
1、安装时configure需加上--with-http_perl_module参数
如果之前已经安装过nginx,可以先通过nginx -V查看原来的安装参数,这次一并加上,避免损坏原配置
2、conf配置
#在http节下配置perl的相关项
perl_modules conf; #指定perl模块的代码路径,这里是在nginx安装目录下的conf目录
perl_require perl_extend.pl; #指定加载的perl脚本文件名
#在server节点下配置对应的处理
server{
......
location ~ "^/uploads/images/.*_center_([-0-9]+)x([-0-9]+)\.(jpg|png|gif|jpeg)" {
root /www/;
add_header Access-Control-Allow-Origin *;
expires 300d;
try_files $uri @center_img_server;
}
#同优先级的正则匹配,所以这个放在后面
location ~ "^/uploads/.*" {
root /www/;
add_header Access-Control-Allow-Origin *;
}
# /uploads/images/1517563972120_center_20x20.jpg
location @center_img_server {
perl resize::center_handler;
}
......
}
3、perl示例,perl_extend.pl
package resize;
use nginx;
use File::Basename;
our $from_dir="/www/";
our $to_dir = "/www/";
sub default_handler {
# my $r = shift;
# $r->send_http_header("text/plain");
# $r->print("not found");
return 409;
}
sub center_handler {
my $r = shift;
my $uri = $r->uri;# 请求规则:/uploads/images/1517563972120_center_20x20.jpg
my($prefix, undef, $suffix) = split("_",$uri,3);#suffix:20x20.jpg
my($dimensions, $ext) = split(/\./,$suffix,2);#dimensions: 20x20
$real_path = $prefix.".".$ext;
#/www//uploads/images/1517563972120.jpg to /www//uploads/images/1517563972120_center_20x20.jpg
$r->log_error(2,$from_dir.$real_path." to ".$to_dir.$uri);
my $sourceIsExist= -e "$from_dir$real_path";
if (! $sourceIsExist) {
return 404;
}
#使用 -extent 参数可以方便的截取中间部分
#不用使用-crop 再详细计算位置之后再裁剪
#^ 的含义是 最大范围保持比例
#convert -resize 200x200^ -gravity center -extent 200x200 a.jpg b.jpg
my $convert = "convert -strip +profile \"*\" -quality 85% -interlace partition -resize $dimensions^ -gravity center -extent $dimensions $from_dir$real_path $to_dir$uri";
# $r->log_error(2,$convert);
my $result = system($convert);
if( $result == 0){
$r->internal_redirect($uri);
return OK;
}else{
return 404;
}
}
1;
__END__
4、特别注意
当需要在perl里执行system命令时,需要对相应的命令调整权限策略,这里使用chmod u+s /usr/bin/convert来调整convert的执行用户,具体解释:
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。
方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。