Breyta stærð mynda á flugu

Í nánast hvaða vefforriti sem er sem notar myndir þarf að búa til lítil afrit af þessum myndum og oft eru til nokkur snið fyrir aukamyndir.
Að bæta nýjum víddum við núverandi forrit veldur einnig nokkrum höfuðverk. Þess vegna verkefnið:

Verkefni

Við skulum tákna listann yfir kröfur:

  • Búðu til viðbótarmyndir af hvaða sniði sem er á flugu án þess að setja viðbótarvirkni inn í forritið hvenær sem er á meðan forritið er til;
  • Ekki þarf að búa til viðbótarmyndir við hverja beiðni;
  • Slökktu á getu til að búa til viðbótarmyndir af ótilgreindu sniði.

Ég mun útskýra síðasta atriðið, því það stangast aðeins á við fyrsta atriðið. Ef við gerum myndatöku einhverra mynda opna, þá er möguleiki á árás á síðuna með því að búa til fjölda beiðna um að breyta stærð myndarinnar í óendanlega mörg snið, þannig að þetta varnarleysi þarf að loka.

nginx uppsetningarstillingar

Til að leysa ofangreindar kröfur þurfum við eftirfarandi sett af nginx einingum:

Einingar ngx_http_image_filter_module и ngx_http_secure_link_module eru ekki sjálfgefið uppsettar, þannig að þau verða að vera tilgreind á uppsetningarstigi nginx:

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

nginx stillingar

Við bætum nýjum við gestgjafastillingarnar okkar staðsetning og almennar skyndiminni færibreytur:

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

Við bætum einnig nýjum hýsil við stillinguna:

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

Þess vegna er hægt að nálgast fleiri myndir með því að nota eftirfarandi tengla:

* reyna_skrár — næmur fyrir bilum og rússneskum stöfum, svo ég varð að búa til hækju alias.

Notaðu í vefforriti

Á vefforritsstigi geturðu gert eftirfarandi aðferð (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'
                );

Þó ég myndi líka mæla með því að reikna út stærðirnar forskoðun.

Hrífa

Þegar upprunalegu myndinni er eytt verður forsýningum náttúrulega ekki eytt úr skyndiminni fyrr en skyndiminni er ógilt og í okkar tilviki geta forsýningar verið til í einn dag eftir eyðingu, en þetta er hámarkstími.

frumritið

Heimild: www.habr.com

Bæta við athugasemd