Piltide suuruse muutmine reaalajas

Peaaegu igas veebirakenduses, mis kasutab pilte, on vajadus luua nende piltide väiksemaid koopiaid, sageli erinevates formaatidest.
Samuti tekitab uute mõõtmete lisamine olemasolevasse rakendusse mõningaid raskusi. Seega on ülesanne:

Ülesanne

Kuna me oleme nõudmiste nimekirjas:

  • Luua täiendavaid pilte mistahes formaatides reaalajas ilma, et oleks vaja lisada rakendusse täiendavat funktsionaalsust igal rakenduse eluea hetkel;
  • Täiendavaid pilte ei tohi luua iga päringu ajal;
  • Sulgeda võimalus luua täiendavaid pilte, mille formaate ei ole määratletud.

Selgitan viimast punkti, kuna see on veidi vastuolus esimese punktiga. Kui teeme pildiformaatide loomise avatud, on oht, et rünnatakse veebisaiti, esitudes hulgaliselt päringuid pildi suuruse muutmiseks lõputus koguses formaatides; seetõttu tuleb see haavatavus sulgeda.

Nginx'i konfiguratsiooni seadistus

Nende nõuete täitmiseks vajame järgmist nginx moodulite komplekti:

Moodulid ngx_http_image_filter_module ja ngx_http_secure_link_module need ei ole vaikimisi paigaldatud, seega tuleb need määrata seadistamise etapis nginx:

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

nginx konfiguratsioon

Lisame meie hosti konfiguratsiooni uue asukohta ja üldised vahemälu 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 ka uue hosti konfiguratsiooni:

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

Tulemuseks on, et täiendavaid pilte saab linkide kaudu:

* try_files — on tundlik tühikutele ja vene sümbolitele, mistõttu tuli teha töö ümber alias.

Kasutamine veebirakenduses

Veebirakenduse tasemel saab teha järgmise 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'
                );

Kuid soovitaksin veel arvutada mõõtmed preview.

Raud

Kui algne pilt kustutatakse, siis eelvaatekuvat ei eemaldata vahemälust, kuni vahemälu ei muudetud, ja meie puhul võivad eelvaated eksisteerida kuni ühe päeva pärast kustutamist, kuid see on maksimaalne aeg.

originaal

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster