پرواز پر تصاویر کا سائز تبدیل کریں۔

تقریباً کسی بھی ویب ایپلیکیشن میں جو تصاویر استعمال کرتی ہے، ان تصاویر کی چھوٹی کاپیاں بنانے کی ضرورت ہوتی ہے، اور اکثر اضافی تصاویر کے لیے کئی فارمیٹس ہوتے ہیں۔
موجودہ ایپلی کیشن میں نئی ​​جہتیں شامل کرنا بھی کچھ سر درد کا باعث بنتا ہے۔ لہذا کام:

ٹاسک

آئیے ضروریات کی فہرست کی نشاندہی کرتے ہیں:

  • ایپلی کیشن کے وجود کے دوران کسی بھی وقت ایپلی کیشن میں اضافی فعالیت کو متعارف کرائے بغیر پرواز پر کسی بھی فارمیٹ کی اضافی تصاویر بنائیں؛
  • ہر درخواست پر اضافی تصاویر بنانے کی ضرورت نہیں ہے۔
  • غیر متعینہ فارمیٹس کی اضافی تصاویر بنانے کی صلاحیت کو غیر فعال کریں۔

میں آخری نکتہ کی وضاحت کروں گا، کیونکہ یہ پہلے نقطہ سے قدرے متصادم ہے۔ اگر ہم کسی بھی تصویر کی جنریشن کو اوپن کرتے ہیں، تو تصویر کو لامحدود فارمیٹس میں تبدیل کرنے کی درخواستوں کی ایک بڑی تعداد پیدا کرکے سائٹ پر حملے کا امکان ہوتا ہے، اس لیے اس خطرے کو بند کرنے کی ضرورت ہے۔

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 — خالی جگہوں اور روسی کرداروں کے لیے حساس، اس لیے مجھے بیساکھی بنانا پڑی۔ عرف.

ویب ایپلیکیشن میں استعمال کریں۔

ویب ایپلیکیشن کی سطح پر، آپ درج ذیل طریقہ کار (پرل) کر سکتے ہیں:

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

نیا تبصرہ شامل کریں