nginx添加perl模块实现缩略图功能

一、安装perl依赖库

yum -y install perl-ExtUtils-Embed

二、nginx配置

1、安装时configure需加上--with-http_perl_module参数

      如果之前已经安装过nginx,可以先通过nginx -V查看原来的安装参数,这次一并加上,避免损坏原配置

       参见  已安装nginx动态添加模块

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位。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值