Динамический ресайз изображений

Данный способ позволит делать динамический ресайз изображений с кешированием результатов на диске.

Подключение модуля ngx_http_image_filter_module

/etc/nginx/nginx.conf
include /usr/share/nginx/modules/mod-http-image-filter.conf;

Создание сервера для изменения размеров изображений на порту 8082

/etc/nginx/conf.d/img-resize.conf
# Сервер для изменения размеров изображений
# @link https://habr.com/ru/post/77873/
server {
  listen                          8082;
 
  access_log                      /var/log/nginx/img-resize.access.log combined;
  error_log                       /var/log/nginx/img-resize.error.log;
 
  # Ошибки отправляем на отдельный location
  error_page                      403 404 415 500 502 503 504 = @404;
 
  # информация
  location ~ ^/i/(.+) {
      # грязный хак от Игоря Сысоева
      # try_files — чувствителен к пробелам и русским символам, поэтому пришлось сделать костыль с alias
      alias                       /vhosts/site.ru/www/$1;
      try_files                   "" @404;
 
      # Проверяем правильность ссылки и md5
 
      # Используем соответсвующий фильтр
      image_filter                size;
  }
 
  # crop
  location ~ ^/c/(\d+|-)x(\d+|-)/(.+) {
      set                         $width  $1;
      set                         $height $2;
 
      alias                       /vhosts/site.ru/www/$3;
      try_files                   "" @404;
 
      image_filter                crop  $width  $height;
  }
 
  # resize
  location ~ ^/r/(\d+|-)x(\d+|-)/(.+) {
      set                         $width  $1;
      set                         $height $2;
 
      alias                       /vhosts/site.ru/www/$3;
      try_files                   "" @404;
 
      image_filter                resize  $width  $height;
  }
 
  location @404 { return 404; }
}

Источник

Создание location, который будет обслуживать ресайз изображений

/etc/nginx/img-resize-location.conf
location ~ ^/preview/([cir])/(.+) {
    # Тип операции
    set                         $oper $1;
    # Параметры изображения и путь к файлу
    set                         $remn $2;
    # Проксируем на отдельный хост
    proxy_pass                  http://127.0.0.1:8082/$oper/$remn;
    proxy_intercept_errors      on;
    error_page                  404 = /empty.gif;
    # Кеширование
    proxy_cache                 cache_img;
    proxy_cache_key             "$host$document_uri";
    # 200 ответы кешируем на 1 день
    proxy_cache_valid           200 1d;
    # остальные ответы кешируем на 1 минуту
    proxy_cache_valid           any 1m;
}

Кеширование измененных изображений

/etc/nginx/conf.d/caches.conf
# Кеш для изображений
proxy_cache_path /var/tmp/nginx-cache_img   # путь
  levels=1:2                                # количество уровней
  keys_zone=cache_img:10m                   # название:размер зоны, 1Мб ~ 8000 ключей (1 ключ - 1 запрос)
  max_size=1g                               # размер данных кеша, при превышении удаляются наиболее старые
  inactive=7d                               # время хранения запроса на диске с момента последнего обращения, независимо от Cache-Control
  use_temp_path=off;                        # off - используем proxy_cache_path; on - используем proxy_temp_path, указанный в location

Настройка сайта

/etc/nginx/conf.d/site.ru.conf
location = /empty.gif {
  empty_gif;
}
 
location ~* ^.+\.(jpg|jpeg|gif|png|css|js|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|xml|docx|xlsx)$ {
  root /vhosts/site.ru/www;
  index  index.php index.html;
  access_log off;
  expires 30d;
  include img-resize-location.conf;
}
Печать/экспорт