Փոփոխեք պատկերների չափերը անմիջապես

Գրեթե ցանկացած վեբ հավելվածում, որն օգտագործում է պատկերներ, անհրաժեշտություն կա ստեղծելու այդ պատկերների փոքր պատճենները, և հաճախ կան մի քանի ձևաչափեր լրացուցիչ պատկերների համար:
Գոյություն ունեցող հավելվածին նոր չափումներ ավելացնելը նաև որոշ գլխացավեր է առաջացնում: Հետևաբար առաջադրանքը.

Առաջադրանք

Նշենք պահանջների ցանկը.

  • Ստեղծեք ցանկացած ձևաչափի հավելյալ պատկերներ՝ առանց հավելվածի գոյության ընթացքում ցանկացած պահի հավելվածում լրացուցիչ ֆունկցիոնալություն մտցնելու.
  • Լրացուցիչ պատկերներ պետք չէ ստեղծել յուրաքանչյուր խնդրանքով.
  • Անջատեք չճշտված ձևաչափերի լրացուցիչ պատկերներ ստեղծելու հնարավորությունը:

Ես կբացատրեմ վերջին կետը, քանի որ այն փոքր-ինչ հակասում է առաջին կետին։ Եթե ​​մենք բաց դարձնենք ցանկացած պատկերի գեներացիան, ապա կայքի վրա հարձակման հավանականություն կա՝ ստեղծելով մեծ թվով հարցումներ՝ պատկերը չափափոխելու անսահման թվով ձևաչափերի, ուստի այս խոցելիությունը պետք է փակվի:

nginx տեղադրման կոնֆիգուրացիա

Վերոնշյալ պահանջները լուծելու համար մեզ անհրաժեշտ է nginx մոդուլների հետևյալ հավաքածուն.

Մոդուլներ ngx_http_image_filter_module и ngx_http_secure_link_module լռելյայն տեղադրված չեն, ուստի դրանք պետք է նշվեն տեղադրման կազմաձևման փուլում nginx:

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

nginx կոնֆիգուրացիա

Մենք ավելացնում ենք նորը մեր հյուրընկալողի կազմաձևում գտնվելու վայրը և ընդհանուր քեշի պարամետրերը.

...
    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;
        }
...
    }
...

Մենք նաև նոր հոսթ ենք ավելացնում կոնֆիգուրային.

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; }
}

Արդյունքում լրացուցիչ պատկերներ կարելի է ստանալ՝ օգտագործելով հետևյալ հղումները.

* try_files — զգայուն է տարածությունների և ռուսերեն նիշերի նկատմամբ, ուստի ես ստիպված էի հենակ պատրաստել Alias.

Օգտագործեք վեբ հավելվածում

Վեբ հավելվածի մակարդակում կարող եք կատարել հետևյալ ընթացակարգը (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'
                );

Թեեւ խորհուրդ կտամ նաեւ չափերը հաշվարկել Preview.

Rake

Բնօրինակ պատկերը ջնջելիս նախադիտումները, բնականաբար, չեն ջնջվի քեշից մինչև քեշը չեղյալ համարվի, իսկ մեր դեպքում նախադիտումները կարող են գոյություն ունենալ ջնջելուց հետո մեկ օր, բայց սա առավելագույն ժամանակն է:

բնօրինակը

Source: www.habr.com

Добавить комментарий