nginx + image_filter_module 实时生成缩略图到本地

2016年8月11日

安装环境LAMP OR LNMP 这里不做详解 查看其他文章 , nginx -V  看看编译的参数中是否有 --with-http_image_filter_module

贴上一份我的Nginx 参数  这里我得测试环境为 Ubuntu 16  ,  但是此配置 CentOS Debain 下应该一样适用。

root@120413:~# nginx -V
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 安装的 下面是我编译的

root@monitoring:~# /usr/local/nginx/sbin/nginx -V
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 站点的配置 文件

 

  1. server {
  2. listen 23.88.229.213:80;
  3. server_name www.world-alive.win;
  4. image_filter_sharpen 80;
  5. root /home/data/www/htdocs/world-alive.win;
  6. access_log /var/log/nginx/www.world-alive.win-access.log;
  7. location ~* ^/resize {
  8. ### 生成缩略图的路径 (类似于站点根目录)
  9. alias /data/site_cache/world-alive.win;
  10. ### 默认 宽度 高度
  11. set $width 150;
  12. set $height 100;
  13. ## 默认的 _$1x$2 也就是 _150x100
  14. set $dimens "";
  15. ### 当在浏览器或者说url 输入 resize_400x400 自动匹配url中的width height
  16. if ($uri ~* "^/resize_(\d+)x(\d+)/(.*)" ) {
  17. set $width $1;
  18. set $height $2;
  19. set $image_path $3;
  20. set $demins "_$1x$2";
  21. }
  22. ### 当在浏览器或者说url 输入 resize 即不带指定的 width height
  23. if ($uri ~* "^/resize/(.*)" ) {
  24. set $image_path $1;
  25. }
  26. set $image_uri _resize/$image_path?width=$width&height=$height;
  27. if (!-f $request_filename) {
  28. proxy_pass http://23.88.229.213/$image_uri;
  29. break;
  30. }
  31. ### 生成缩略图的具体路径 指定长宽的 resize_**x**/$image_path 不指定 resize/$image_path
  32. ### resize$demins 中 resize 为自定义
  33. proxy_store /data/site_cache/world-alive.win/resize$demins/$image_path;
  34. proxy_store_access user:rw group:rw all:r;
  35. proxy_set_header Host $host;
  36. #expires 30d;
  37. access_log off;
  38. }
  39. location /_resize {
  40. ## 指定图片所在的位置 如果指在根目录 则生成缩略图 /resize$demins/$image_path; 中$image_path 会带上图片路径的文件夹的名称 例如 resize_100x100/image/001.jpg 如果指定图片位置 47行注释那句 则产生的路径为 resize_100x100/001.jpg ;
  41. alias /home/data/www/htdocs/world-alive.win;
  42. #alias /home/data/www/htdocs/world-alive.win/image;
  43. image_filter resize $arg_width $arg_height;
  44. image_filter_jpeg_quality 95;
  45. access_log off;
  46. }
  47. ####### 当你还有其他的目录的图片需要生成缩略图 上面的配置你需要修改的为下列红色部分
  48. location ~* ^/pimg {
  49. alias /usr/local/cache/img;
  50. set $width 150;
  51. set $height 100;
  52. set $dimens "";
  53. if ($uri ~* "^/pimg_(\d+)x(\d+)/(.*)" ) {
  54. set $width $1;
  55. set $height $2;
  56. set $image_path $3;
  57. set $demins "_$1x$2";
  58. }
  59. if ($uri ~* "^/pimg/(.*)" ) {
  60. set $image_path $1;
  61. }
  62. set $image_uri _iiresize/$image_path?width=$width&height=$height;
  63. if (!-f $request_filename) {
  64. proxy_pass http://23.88.229.213/$image_uri;
  65. break;
  66. }
  67. proxy_store /usr/local/cache/img/pimg$demins/$image_path;
  68. proxy_store_access user:rw group:rw all:r;
  69. proxy_set_header Host $host;
  70. #expires 30d;
  71. access_log off;
  72. }
  73. location /_iiresize {
  74. alias /home/data/www/htdocs/world-alive.win/picture;
  75. image_filter resize $arg_width $arg_height;
  76. image_filter_jpeg_quality 95;
  77. access_log off;
  78. }
  79. ###########################################################################
  80. location ~ \.php$ {
  81. root /home/data/www/htdocs/world-alive.win;
  82. include fastcgi_params;
  83. #fastcgi_pass unix:/dev/.sock;
  84. fastcgi_pass unix:/run/php/php7.0-fpm.sock;
  85. fastcgi_index index.php;
  86. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  87. }
  88. location / {
  89. index index.php index.html index.htm;
  90. try_files $uri $uri/ index.php$uri?$args;
  91. }
  92. }

###############################################################################
## 提醒注意 :  能力问题吧 有几个地方更改之后 各种错
## 一     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/

没有评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注