Mezinahiya wêneyên li ser firînê biguherînin

Hema hema di her serîlêdana webê ya ku wêneyan bikar tîne de, pêdivî ye ku kopiyên piçûk ên van wêneyan biafirînin, û bi gelemperî ji bo wêneyên zêde çend format hene.
Zêdekirina pîvanên nû li serîlêdanek heyî jî dibe sedema hin serêş. Ji ber vê yekê peywir:

Armanc

Ka em navnîşa pêdiviyan destnîşan bikin:

  • Di dema hebûna serîlêdanê de di her kêliyê de bêyî danasîna fonksiyonên zêde di serîlêdanê de wêneyên zêde yên her formatê biafirînin;
  • Ne hewce ye ku wêneyên zêde li ser her daxwazê ​​bêne çêkirin;
  • Kapasîteya çêkirina wêneyên zêde yên formatên nenas neçalak bike.

Ez ê xala dawîn şirove bikim, ji ber ku ew hinekî berevajî xala yekem e. Ger em hilberîna her wêneyan vekin, wê hingê îhtîmalek heye ku êrîşek li ser malperê çêbibe bi çêkirina hejmareke mezin daxwazî ​​​​ji bo veguhertina mezinahiya wêneyê di hejmareke bêdawî ya formatan de, ji ber vê yekê pêdivî ye ku ev lawaz were girtin.

veavakirina sazkirinê ya nginx

Ji bo çareserkirina daxwazên jorîn, em hewceyê komek modulên nginx-ê yên jêrîn in:

Modûl ngx_http_image_filter_module и ngx_http_secure_link_module ji hêla xwerû ve nayên saz kirin, ji ber vê yekê divê ew di qonaxa veavakirina sazkirinê de bêne diyar kirin nginx:

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

veavakirina nginx

Em yekî nû li veavakirina mêvandarê xwe zêde dikin cîh û parametreyên cache giştî:

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

Em jî mêvandarek nû li mîhengê zêde dikin:

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

Wekî encamek, wêneyên din dikarin bi karanîna girêdanên jêrîn werin wergirtin:

* try_files - ji mekan û tîpên rûsî re hesas e, ji ber vê yekê min neçar ma ku pê re kulmek çêkim navê alê.

Di serîlêdana webê de bikar bînin

Di asta serîlêdana malperê de, hûn dikarin prosedûra jêrîn bikin (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'
                );

Her çend ez ê hesabkirina pîvanan jî pêşniyar bikim pêşnerîn.

Rake

Dema ku wêneya orîjînal jêbirin, pêşdîtin, bi xwezayî, dê ji cache neyên jêbirin heya ku cache betal nebe, û di rewşa me de, pêşdîtin dikarin rojek piştî jêbirinê hebin, lê ev dema herî zêde ye.

xwemalî

Source: www.habr.com

Add a comment