Tasvirlarning hajmini tezda o'zgartiring

Tasvirlardan foydalanadigan deyarli har qanday veb-ilovada ushbu tasvirlarning kichik nusxalarini yaratish zarurati mavjud va ko'pincha qo'shimcha tasvirlar uchun bir nechta formatlar mavjud.
Mavjud dasturga yangi o'lchamlarni qo'shish ham ba'zi bosh og'rig'iga sabab bo'ladi. Shunday qilib, vazifa:

Maqsad

Keling, talablar ro'yxatini belgilaylik:

  • Ilova mavjud bo'lgan istalgan vaqtda ilovaga qo'shimcha funksiyalar kiritmasdan istalgan formatdagi qo'shimcha tasvirlarni tezda yarating;
  • Har bir so'rov bo'yicha qo'shimcha tasvirlar yaratilishi shart emas;
  • Belgilanmagan formatlarning qo'shimcha tasvirlarini yaratish imkoniyatini o'chirib qo'ying.

Men oxirgi fikrni tushuntiraman, chunki u birinchi fikrga biroz zid keladi. Agar biz har qanday tasvirni yaratishni ochiq qilsak, unda tasvirni cheksiz ko'p formatlarga o'zgartirish uchun ko'p sonli so'rovlarni yaratish orqali saytga hujum qilish ehtimoli bor, shuning uchun bu zaiflikni yopish kerak.

nginx o'rnatish konfiguratsiyasi

Yuqoridagi talablarni hal qilish uchun bizga quyidagi nginx modullari to'plami kerak bo'ladi:

Moduli ngx_http_image_filter_module и ngx_http_secure_link_module sukut bo'yicha o'rnatilmagan, shuning uchun ular o'rnatish konfiguratsiyasi bosqichida ko'rsatilishi kerak nginx:

phoinix@phoinix-work:~/src/nginx-0.8.29
$ ./configure --with-http_secure_link_module --with-http_image_filter_module

nginx konfiguratsiyasi

Xost konfiguratsiyasiga yangisini qo'shamiz Manzil va umumiy kesh parametrlari:

...
    proxy_cache_path /www/myprojects/cache levels=1:2 keys_zone=image-preview:10m;
...
    server {
...
        location ~ ^/preview/([cir])/(.+) {
        # Тип операции
            set                         $oper $1;
        # Параметры изображения и путь к файлу
            set                         $remn $2;
        # Проксируем на отдельный хост
            proxy_pass                  http://myproject.ru:81/$oper/$remn;
            proxy_intercept_errors      on;
            error_page                  404 = /preview/404;
        # Кеширование
            proxy_cache                 image-preview;
            proxy_cache_key             "$host$document_uri";
        # 200 ответы кешируем на 1 день
            proxy_cache_valid           200 1d;
        # остальные ответы кешируем на 1 минуту
            proxy_cache_valid           any 1m;
        }
        
        # Возвращаем ошибку
        location = /preview/404 {
            internal;
            default_type                image/gif;
            alias                       /www/myprojects/image/noimage.gif;
        }
...
    }
...

Shuningdek, konfiguratsiyaga yangi xost qo'shamiz:

server {
    server_name                     myproject.ru;
    listen                          81;

    access_log                      /www/myproject.ru/logs/nginx.preview.access_log;
    error_log                       /www/myproject.ru/logs/nginx.preview.error_log info;

    # Указываем секретное слово для md5
    secure_link_secret              secret;

    # Ошибки отправляем она отдельный location
    error_page                      403 404 415 500 502 503 504 = @404;

    # location Для фильтра size
    location ~ ^/i/[^/]+/(.+) {
        
        # грязный хак от Игоря Сысоева *
        alias                       /www/myproject.ru/images/$1;
        try_files                   "" @404;
    
        # Проверяем правильность ссылки и md5
        if ($secure_link = "") { return 404; }
        
        # Используем соответсвующий фильтр
        image_filter                size;
    }

    # По аналогии остальные location для других фильтров
    location ~ ^/c/[^/]+/(d+|-)x(d+|-)/(.+) {
        set                         $width  $1;
        set                         $height $2;
        
        alias                       /www/myproject.ru/images/$3;
        try_files                   "" @404;
    
        if ($secure_link = "") { return 404; }
    
        image_filter                crop  $width  $height;
    }
    
    location ~ ^/r/[^/]+/(d+|-)x(d+|-)/(.+) {
        set                         $width  $1;
        set                         $height $2;

        alias                       /www/myproject.ru/images/$3;
        try_files                   "" @404;

        if ($secure_link = "") { return 404; }

        image_filter                resize  $width  $height;
    }

    location @404 { return 404; }
}

Natijada, quyidagi havolalar yordamida qo'shimcha rasmlarni olish mumkin:

* try_files - bo'shliqlar va ruscha belgilarga sezgir, shuning uchun men qo'ltiq tayoq yasashga majbur bo'ldim afsus.

Veb-ilovada foydalaning

Veb-ilova darajasida siz quyidagi protsedurani bajarishingiz mumkin (Perl):

sub proxy_image {
    use Digest::MD5     qw /md5_hex/;
    my %params = @_;
    my $filter = {
                    size    => 'i',
                    resize  => 'r',
                    crop    => 'c'            
                  }->{$params{filter}} || 'r';
    my $path = ($filter ne 'i' ?
                    ( $params{height} || '_' ) . 'x' . ( $params{width} || '_' ) . '/' :
                    ()
               ) . $params{source};
    my $md5 = md5_hex( $path . 'secret' );
    $path = '/preview/' . $filter . '/' . $md5 . '/' . $path;
    return $path;
}

my $preview_path = &proxy_image(
                    source  => 'image1.jpg',
                    height  => 100,
                    width   => 100,
                    filter  => 'resize'
                );

Garchi men o'lchamlarni hisoblashni tavsiya qilaman ko'rib chiqish.

Rake

Asl tasvirni o'chirishda, oldindan ko'rishlar, tabiiyki, kesh bekor qilinmaguncha keshdan o'chirilmaydi va bizning holatlarimizda, oldindan ko'rishlar o'chirilgandan keyin bir kun davomida mavjud bo'lishi mumkin, ammo bu maksimal vaqt.

original

Manba: www.habr.com

a Izoh qo'shish