Pildi suuruse muutmine käigult

Peaaegu igas pilte kasutavas veebirakenduses on vaja luua nendest piltidest väikesed koopiad ja sageli on lisapiltide jaoks mitu vormingut.
Omajagu peavalu tekitab ka uute dimensioonide lisamine olemasolevale rakendusele. Seega ülesanne:

Ülesanne

Tähistame nõuete loendit:

  • Genereerige mis tahes vormingus lisapilte käigupealt ilma rakendusele lisafunktsioone lisamata igal ajal rakenduse eksisteerimise ajal;
  • Lisapilte ei pea genereerima iga taotluse korral;
  • Keela võimalus genereerida määratlemata vormingus täiendavaid pilte.

Selgitan viimast punkti, sest see on esimese punktiga veidi vastuolus. Kui muudame mis tahes piltide genereerimise avatuks, on võimalik saidi rünnak, genereerides suure hulga taotlusi pildi suuruse muutmiseks lõpmatusse arvusse vormingutesse, seega tuleb see haavatavus sulgeda.

nginxi installikonfiguratsioon

Ülaltoodud nõuete lahendamiseks vajame järgmist nginxi moodulite komplekti:

Moodulid ngx_http_image_filter_module и ngx_http_secure_link_module ei ole vaikimisi installitud, seega tuleb need installimise konfigureerimisetapis täpsustada nginx:

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

nginxi konfiguratsioon

Lisame oma hostikonfiguratsioonile uue liising ja vahemälu üldised parameetrid:

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

Lisame konfiguratsiooni ka uue hosti:

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

Selle tulemusel saate täiendavaid pilte järgmiste linkide kaudu:

* proovi_failid — tundlik tühikute ja vene tähemärkide suhtes, nii et pidin karku tegema alias.

Kasuta veebirakenduses

Veebirakenduse tasemel saate teha järgmist protseduuri (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'
                );

Kuigi soovitaks ka suurused välja arvutada preview.

Rake

Algse pildi kustutamisel ei kustutata eelvaateid vahemälust loomulikult enne, kui vahemälu on kehtetuks tunnistatud, ja meie puhul võivad eelvaated eksisteerida päev pärast kustutamist, kuid see on maksimaalne aeg.

originaal

Allikas: www.habr.com

Lisa kommentaar