Кескіндердің өлшемін жылдам өзгертіңіз

Кескіндерді пайдаланатын кез келген дерлік веб-бағдарламада осы кескіндердің шағын көшірмелерін жасау қажеттілігі туындайды және жиі қосымша кескіндер үшін бірнеше пішім бар.
Бар қолданбаға жаңа өлшемдерді қосу да кейбір бас ауруларын тудырады. Сондықтан тапсырма:

Мақсаты

Талаптар тізімін белгілейік:

  • Қолданба бар кез келген уақытта қолданбаға қосымша функционалдық мүмкіндіктер енгізбестен, кез келген форматтағы қосымша кескіндерді жылдам жасаңыз;
  • Әрбір сұраныс бойынша қосымша кескіндерді жасау қажет емес;
  • Белгіленбеген пішімдердің қосымша кескіндерін жасау мүмкіндігін өшіріңіз.

Мен соңғы тармақты түсіндіремін, өйткені ол бірінші тармаққа сәл қайшы келеді. Егер біз кез келген кескіннің генерациясын ашық етсек, онда кескіннің өлшемін форматтардың шексіз санына өзгертуге көптеген сұраныстарды жасау арқылы сайтқа шабуыл жасау мүмкіндігі бар, сондықтан бұл осалдықты жабу керек.

nginx орнату конфигурациясы

Жоғарыда аталған талаптарды шешу үшін бізге nginx модульдерінің келесі жиынтығы қажет:

Модульдер ngx_http_image_filter_module и ngx_http_secure_link_module әдепкі бойынша орнатылмайды, сондықтан оларды орнату конфигурациялау сатысында көрсету керек nginx:

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

nginx конфигурациясы

Біз хост конфигурациясына жаңасын қосамыз орналасқан жері және жалпы кэш параметрлері:

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

Біз конфигурацияға жаңа хост қосамыз:

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

Нәтижесінде қосымша суреттерді келесі сілтемелер арқылы алуға болады:

* try_files — бос орындарға және орыс таңбаларына сезімтал, сондықтан мен балдақ жасауға тура келді ат.

Веб қолданбасында пайдаланыңыз

Веб қолданба деңгейінде келесі процедураны орындауға болады (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'
                );

Дегенмен мен өлшемдерді есептеуді ұсынар едім алдын-ала қарау.

Rake

Түпнұсқа кескінді жойған кезде, алдын ала қараулар, әрине, кэш жарамсыз болмайынша, кэштен жойылмайды, ал біздің жағдайда алдын ала қараулар жойылғаннан кейін бір күн ішінде болуы мүмкін, бірақ бұл максималды уақыт.

түпнұсқа

Ақпарат көзі: www.habr.com

пікір қалдыру