Сүрөттүн көлөмү тез өзгөрөт

Сүрөттөрдү колдонгон дээрлик бардык веб-тиркемелерде бул сүрөттөрдүн кичинекей көчүрмөлөрүн түзүү зарылчылыгы бар жана көбүнчө кошумча сүрөттөр үчүн бир нече форматтар бар.
Учурдагы колдонмого жаңы өлчөмдөрдү кошуу да кээ бир баш ооруну жаратат. Демек, милдет:

маселе

Келгиле, талаптардын тизмесин белгилейли:

  • Колдонмого кошумча функцияларды киргизбестен, каалаган форматтагы кошумча сүрөттөрдү тиркеме иштеп турган убакта пайда кылуу;
  • Ар бир суроо боюнча кошумча сүрөттөрдү түзүүнүн кереги жок;
  • Белгисиз форматтардын кошумча сүрөттөрүн түзүү мүмкүнчүлүгүн өчүрүңүз.

Мен акыркы пунктту түшүндүрөм, анткени ал биринчи пунктка бир аз карама-каршы келет. Эгерде биз кандайдыр бир сүрөттөрдүн генерациясын ачык кылсак, анда сүрөттүн өлчөмүн чексиз форматтарга өзгөртүү үчүн көп сандагы суроо-талаптарды жаратып, сайтка чабуул жасоо мүмкүнчүлүгү бар, ошондуктан бул кемчиликти жабуу керек.

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

Жогорудагы талаптарды чечүү үчүн бизге nginx модулдарынын төмөнкү топтому керек:

модулдар ngx_http_image_filter_module и ngx_http_secure_link_module демейки боюнча орнотулган эмес, ошондуктан алар орнотуу конфигурациясынын этабында көрсөтүлүшү керек жөргөмүш:

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'
                );

Мен да өлчөмдөрүн эсептөөнү сунуш кылат элем да алдын ала кароо.

Рейк

Түпнуска сүрөттү жок кылганда, алдын ала көрүү, албетте, кэш жараксыз болгонго чейин кэштен өчүрүлбөйт, жана биздин учурда, алдын ала көрүү өчүрүлгөндөн кийин бир күн болушу мүмкүн, бирок бул максималдуу убакыт.

баштапкы

Source: www.habr.com

Комментарий кошуу