10
2022
06

Nginx添加模块http_image_filter_module实现图片缩略图功能

前言

我们可能服务器上使用yum安装的Nginx,这时要新增模块的思路大致如下

    官网下载相同版本的nginx源码包
    编译安装并指定需要的模块(第三方模块需要单独下载对应的包)
    注意只编译make,不要编译安装make install. 编译完成会在objs目录下生成可执行文件nginx
    复制nginx 可执行文件cp objs/nginx /usr/sbin/
    复制模块objs/ngx_http_image_filter_module.so
    配置模块

具体步骤
查看原Nginx

查看当前的版本及模块

nginx -V

会看到如下

     nginx version: nginx/1.12.2
     configure arguments: –prefix=/usr/share/nginx –sbin-path=/usr/sbin/nginx –modules-path=/usr/lib64/nginx/modules –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –http-client-body-temp-path=/var/lib/nginx/tmp/client_body –http-proxy-temp-path=/var/lib/nginx/tmp/proxy –http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi –http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi –http-scgi-temp-path=/var/lib/nginx/tmp/scgi –pid-path=/run/nginx.pid –lock-path=/run/lock/subsys/nginx –user=nginx –group=nginx –with-file-aio –with-ipv6 –with-http_auth_request_module –with-http_ssl_module –with-http_v2_module –with-http_realip_module –with-http_addition_module –with-http_xslt_module=dynamic –with-http_image_filter_module=dynamic –with-http_geoip_module=dynamic –with-http_sub_module –with-http_dav_module –with-http_flv_module –with-http_mp4_module –with-http_gunzip_module –with-http_gzip_static_module –with-http_random_index_module –with-http_secure_link_module –with-http_degradation_module –with-http_slice_module –with-http_stub_status_module –with-http_perl_module=dynamic –with-mail=dynamic –with-mail_ssl_module –with-pcre –with-pcre-jit –with-stream=dynamic –with-stream_ssl_module –with-google_perftools_module –with-debug –with-cc-opt=’-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong –param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic’ –with-ld-opt=’-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E’
     

查找

     –with-http_image_filter_module=dynamic
     

我这里就已经包含该模块了如果没有则继续看下文
编译安装

     如果本地已有该模块 这一步则跳过
     

查看Nginx的路径

which nginx

结果如下

     /usr/sbin/nginx
     

备份配置文件

cp -r /etc/nginx /etc/nginx.bak

从官网下载对应版本的源码

比如我的是1.12.2 下载地址http://nginx.org/download/nginx-1.12.2.tar.gz

下载

cd /usr/local
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar -xzvf nginx-1.12.2.tar.gz

HttpImageFilterModule模块需要依赖gd-devel的支持

安装

yum install gd-devel
yum install libxslt-devel
yum -y install perl-devel perl-ExtUtils-Embed

编译

cd nginx-1.12.2

在上面的命令里面加上 --with-http_image_filter_module=dynamic 开始执行编译,编译的时候依赖的模块没有安装导致错误,只需安装对应的模块即可。

./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_auth_request_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug

编译

执行 make,切记不需要执行make install,此处只需要得到nginx重新编译的可执行文件,并不需要重新安装替换掉原来的nginx

make

执行完成会在 objs 目录下生成对应的可执行文件nginx

复制

cp objs/ngx_http_image_filter_module.so /usr/lib64/nginx/modules/
cp -rfp objs/nginx /usr/sbin/

查看模块是否加载

查看

/etc/nginx/nginx.conf中如果有

include /usr/share/nginx/modules/*.conf;

打开对应目录

cd /usr/share/nginx/modules/

如果包含mod-http-image-filter.conf就不用再加载了。

如果没有/etc/nginx/nginx.conf中加载模块

load_module "modules/ngx_http_image_filter_module.so";

配置

/etc/nginx/conf.d/mysite.conf 配置图片处理

location ~* /(.+)\.(jpg|jpeg|gif|png)!(\d+)x(\d+)$ {
        set $w $3;
        set $h $4;
        image_filter resize  $w $h;
        image_filter_buffer  10M;
        image_filter_jpeg_quality 75;
        try_files /$1.$2  /notfound.jpg;
        expires 1d;
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        root  /data/wwwjarapi/8908schoolfiletest/;  
    }

location ~* /static {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        root  /data/wwwjarapi/8908schoolfiletest/;  
    }

如果原图的地址为

     www.psvmc.cm/abc/1.jpg
     

那么缩放后的图片地址为

     www.psvmc.cm/abc/1.jpg!200x200
     

Nginx配置生效的优先级

https://www.psvmc.cn/article/2020-02-11-nginx-config.html

错误示例

比如我按照如下配置就不行

location ~* /(.+)\.(jpg|jpeg|gif|png)!(\d+)x(\d+)$ {
        set $w $3;
        set $h $4;
        image_filter resize  $w $h;
        image_filter_buffer  10M;
        image_filter_jpeg_quality 75;
        try_files /$1.$2  /notfound.jpg;
        expires 1d;
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        root  /data/wwwjarapi/8908schoolfiletest/;  
    }

location ^~ /static {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        root  /data/wwwjarapi/8908schoolfiletest/;  
    }

因为后面的配置优先级高 导致第一个配置不生效

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。