اڏام تي تصويرن جو سائز تبديل ڪريو

تقريبن ڪنهن به ويب ايپليڪيشن ۾ جيڪي تصويرون استعمال ڪندا آهن، انهن تصويرن جون ننڍيون ڪاپيون ٺاهڻ جي ضرورت هوندي آهي، ۽ اڪثر اضافي تصويرن لاءِ ڪيترائي فارميٽ هوندا آهن.
موجوده ايپليڪيشن ۾ نوان طول و عرض شامل ڪرڻ پڻ ڪجهه سر درد جو سبب بڻجن ٿا. تنهن ڪري ڪم:

مقصد

اچو ته ضرورتن جي فهرست کي بيان ڪريون:

  • ايپليڪيشن جي وجود دوران ڪنهن به وقت ايپليڪيشن ۾ اضافي ڪارڪردگي متعارف ڪرائڻ کان سواءِ اڏام تي ڪنهن به شڪل جون اضافي تصويرون ٺاهيو؛
  • هر درخواست تي اضافي تصويرون پيدا ڪرڻ جي ضرورت ناهي؛
  • غير بيان ڪيل فارميٽ جون اضافي تصويرون پيدا ڪرڻ جي صلاحيت کي بند ڪريو.

مان آخري نقطي جي وضاحت ڪندس، ڇاڪاڻ ته اهو ٿورڙي پهرين نقطي جي تضاد آهي. جيڪڏهن اسان ڪنهن به تصويرن جي نسل کي کوليو ٿا، ته پوءِ سائيٽ تي حملي جو امڪان آهي وڏي تعداد ۾ درخواستون پيدا ڪندي تصوير کي لامحدود تعداد ۾ فارميٽ ۾ تبديل ڪرڻ لاءِ، ان ڪري ان خطري کي بند ڪرڻ جي ضرورت آهي.

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

اسان config ۾ هڪ نئون ميزبان پڻ شامل ڪيو:

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

نتيجي طور، ھيٺ ڏنل لنڪ استعمال ڪندي اضافي تصويرون حاصل ڪري سگھجن ٿيون:

* ڪوشش_فائلس - جڳهن ۽ روسي ڪردارن سان حساس، تنهنڪري مون کي هڪ ڪرچ ٺاهڻو پيو عرف.

ويب ايپليڪيشن ۾ استعمال ڪريو

ويب ايپليڪيشن جي سطح تي، توھان ھيٺ ڏنل عمل ڪري سگھو ٿا (پرل):

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

جيتوڻيڪ آئون پڻ سفارش ڪندس ته سائزن جي حساب سان پريو.

ريڪ

اصل تصوير کي حذف ڪرڻ وقت، ڏيکاءُ، قدرتي طور تي، ڪيش مان ڊهي نه ويندا جيستائين ڪيش کي غلط قرار نه ڏنو وڃي، ۽ اسان جي صورت ۾، ڏيکاءُ حذف ٿيڻ کان پوءِ هڪ ڏينهن تائين موجود ٿي سگهي ٿو، پر اهو وڌ ۾ وڌ وقت آهي.

اصل آهي

جو ذريعو: www.habr.com

تبصرو شامل ڪريو