安装环境LAMP OR LNMP 这里不做详解 查看其他文章 , nginx -V 看看编译的参数中是否有 --with-http_image_filter_module
贴上一份我的Nginx 参数 这里我得测试环境为 Ubuntu 16 , 但是此配置 CentOS Debain 下应该一样适用。
nginx version: nginx/1.10.0 (Ubuntu)
built with OpenSSL 1.0.2g-fips 1 Mar 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads
上述为 Ubuntu apt-get 安装的 下面是我编译的
nginx version: nginx/1.9.0
built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
built with OpenSSL 1.0.1f 6 Jan 2014
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_realip_module --add-module=/usr/local/src/ngx_cache_purge-2.3 --with-pcre=/usr/local/pcre-8.38 --with-http_image_filter_module --with-http_dav_module --with-http_flv_module --with-http_random_index_module --with-http_secure_link_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-http_gunzip_module --with-http_auth_request_module --with-http_geoip_module
我得nginx 站点的配置 文件
- server {
- listen 23.88.229.213:80;
- server_name www.world-alive.win;
- image_filter_sharpen 80;
- root /home/data/www/htdocs/world-alive.win;
- access_log /var/log/nginx/www.world-alive.win-access.log;
- location ~* ^/resize {
- ### 生成缩略图的路径 (类似于站点根目录)
- alias /data/site_cache/world-alive.win;
- ### 默认 宽度 高度
- set $width 150;
- set $height 100;
- ## 默认的 _$1x$2 也就是 _150x100
- set $dimens "";
- ### 当在浏览器或者说url 输入 resize_400x400 自动匹配url中的width height
- if ($uri ~* "^/resize_(\d+)x(\d+)/(.*)" ) {
- set $width $1;
- set $height $2;
- set $image_path $3;
- set $demins "_$1x$2";
- }
- ### 当在浏览器或者说url 输入 resize 即不带指定的 width height
- if ($uri ~* "^/resize/(.*)" ) {
- set $image_path $1;
- }
- set $image_uri _resize/$image_path?width=$width&height=$height;
- if (!-f $request_filename) {
- proxy_pass http://23.88.229.213/$image_uri;
- break;
- }
- ### 生成缩略图的具体路径 指定长宽的 resize_**x**/$image_path 不指定 resize/$image_path
- ### resize$demins 中 resize 为自定义
- proxy_store /data/site_cache/world-alive.win/resize$demins/$image_path;
- proxy_store_access user:rw group:rw all:r;
- proxy_set_header Host $host;
- #expires 30d;
- access_log off;
- }
- location /_resize {
- ## 指定图片所在的位置 如果指在根目录 则生成缩略图 /resize$demins/$image_path; 中$image_path 会带上图片路径的文件夹的名称 例如 resize_100x100/image/001.jpg 如果指定图片位置 47行注释那句 则产生的路径为 resize_100x100/001.jpg ;
- alias /home/data/www/htdocs/world-alive.win;
- #alias /home/data/www/htdocs/world-alive.win/image;
- image_filter resize $arg_width $arg_height;
- image_filter_jpeg_quality 95;
- access_log off;
- }
- ####### 当你还有其他的目录的图片需要生成缩略图 上面的配置你需要修改的为下列红色部分
- location ~* ^/pimg {
- alias /usr/local/cache/img;
- set $width 150;
- set $height 100;
- set $dimens "";
- if ($uri ~* "^/pimg_(\d+)x(\d+)/(.*)" ) {
- set $width $1;
- set $height $2;
- set $image_path $3;
- set $demins "_$1x$2";
- }
- if ($uri ~* "^/pimg/(.*)" ) {
- set $image_path $1;
- }
- set $image_uri _iiresize/$image_path?width=$width&height=$height;
- if (!-f $request_filename) {
- proxy_pass http://23.88.229.213/$image_uri;
- break;
- }
- proxy_store /usr/local/cache/img/pimg$demins/$image_path;
- proxy_store_access user:rw group:rw all:r;
- proxy_set_header Host $host;
- #expires 30d;
- access_log off;
- }
- location /_iiresize {
- alias /home/data/www/htdocs/world-alive.win/picture;
- image_filter resize $arg_width $arg_height;
- image_filter_jpeg_quality 95;
- access_log off;
- }
- ###########################################################################
- location ~ \.php$ {
- root /home/data/www/htdocs/world-alive.win;
- include fastcgi_params;
- #fastcgi_pass unix:/dev/.sock;
- fastcgi_pass unix:/run/php/php7.0-fpm.sock;
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- }
- location / {
- index index.php index.html index.htm;
- try_files $uri $uri/ index.php$uri?$args;
- }
- }
###############################################################################
## 提醒注意 : 能力问题吧 有几个地方更改之后 各种错
## 一 if ($uri ~* "^/resize_(\d+)x(\d+)/(.*)" ) 这里前缀可以改 但是我改成 /resize/(\d+)x(\d+)/(.*) 这样的方式我将出现 415 的报错
## 二 location /_resize { 如果在 _ 前面加前缀 例如 img_resize 就会得不到图片
## 理论上这应该都是行得通的才对 , 以后有时间在做测试
###############################################################################
生成缩略图流程如下:
1、原图在www.world-alive.win/image/001.jpg。我需要一份100x100的缩略图。
2、请求的缩略图路径:
这里有点小问题提醒下 例如
我有一个站点 www.world-alive.win 站点下有 image img 两个图片文件夹(两个三个还是一个无所谓啦这里是因为我多添加了一个 pimg 就是在多个目录复制前一个需要改那些地方)
如果在 _*resize 中使用根目录
alias /home/data/www/htdocs/world-alive.win;
url为:www.world-alive.win/resize_100x100/image/001.jpg .
如果指定在图片目录
#alias /home/data/www/htdocs/world-alive.win/image;
则需要去掉该层目录
url为:www.world-alive.win/resize_100x100/001.jpg .
3、这个请求进入了location ~* ^/resize,接着判断image_path这个目录下是否存在这张图片,如果存在直接放回给用户,
4、不存在那么跳转到http://www.world-alive.win/_resize/image/001.jpg?width=100&height=100;
5、location /image_resize根据传入的width和height执行缩略功能,并且设置图像质量为95
6、接着生成文件到/data/site_cache/www.world-alive.win/resize_100x100/image/1.jpg
7、并且返回图片给用户
8、nginx生成缩略图到硬盘上的功能到这里就结束了
参考 http://www.ttlsa.com/nginx/nginx-create-image-on-disk/
没有评论