Feroarje ôfbyldings op 'e flecht

Yn hast elke webapplikaasje dy't ôfbyldings brûkt, is d'r needsaak om lytse kopyen fan dizze ôfbyldings te meitsjen, en faak binne d'r ferskate formaten foar ekstra ôfbyldings.
It tafoegjen fan nije dimensjes oan in besteande applikaasje soarget ek foar wat hoofdpijn. Dêrom de taak:

Objective

Litte wy de list mei easken oanjaan:

  • Generearje ekstra ôfbyldings fan elk formaat op 'e flecht sûnder ekstra funksjonaliteit yn' e applikaasje yn te fieren op elk momint tidens it bestean fan 'e applikaasje;
  • Oanfoljende ôfbyldings hoege net op elke oanfraach te generearjen;
  • Skeakelje de mooglikheid om ekstra ôfbyldings fan net spesifisearre formaten te generearjen.

Ik sil it lêste punt útlizze, om't it it earste punt in bytsje tsjinsprekt. As wy de generaasje fan alle ôfbyldings iepen meitsje, dan is d'r in mooglikheid fan in oanfal op 'e side troch it generearjen fan in grut oantal oanfragen om de ôfbylding te feroarjen yn in ûneinich oantal formaten, sadat dizze kwetsberens sletten wurde moat.

nginx ynstallaasje konfiguraasje

Om de boppesteande easken op te lossen hawwe wy de folgjende set nginx-modules nedich:

Modules ngx_http_image_filter_module и ngx_http_secure_link_module binne net standert ynstalleare, sadat se moatte wurde oantsjutte yn 'e ynstallaasjekonfiguraasjestadium nginx:

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

nginx konfiguraasje

Wy foegje in nije ta oan ús hostkonfiguraasje lokaasje en algemiene cache parameters:

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

Wy foegje ek in nije host ta oan de konfiguraasje:

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

As resultaat kinne ekstra ôfbyldings wurde krigen mei de folgjende keppelings:

* try_files - gefoelich foar spaasjes en Russyske tekens, dus ik moast meitsje in kruk mei alias.

Brûk yn in webapplikaasje

Op it nivo fan webapplikaasje kinne jo de folgjende proseduere dwaan (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'
                );

Hoewol't ik soe ek riede berekkenjen de maten preview.

Rake

By it wiskjen fan de orizjinele ôfbylding, sille foarbylden, fansels, net wiske wurde út it cache oant de cache is ûnjildich, en yn ús gefal kinne foarbylden bestean foar in dei nei wiskjen, mar dit is de maksimale tiid.

de orizjinele

Boarne: www.habr.com

Add a comment