การปรับขนาดภาพได้ทันที

ในเกือบทุกแอปพลิเคชันบนเว็บที่ใช้รูปภาพ จำเป็นต้องสร้างสำเนาเล็กๆ ของรูปภาพเหล่านี้ และบ่อยครั้งที่รูปภาพเพิ่มเติมมีหลายรูปแบบ
การเพิ่มมิติใหม่ให้กับแอปพลิเคชันที่มีอยู่ยังทำให้เกิดอาการปวดหัวอีกด้วย ดังนั้นภารกิจ:

งาน

เรามาแสดงรายการข้อกำหนดกัน:

  • สร้างรูปภาพเพิ่มเติมในรูปแบบใด ๆ ได้ทันทีโดยไม่ต้องเพิ่มฟังก์ชันการทำงานเพิ่มเติมในแอปพลิเคชันได้ตลอดเวลาระหว่างที่แอปพลิเคชันมีอยู่
  • ไม่จำเป็นต้องสร้างรูปภาพเพิ่มเติมในทุกคำขอ
  • ปิดใช้งานความสามารถในการสร้างรูปภาพเพิ่มเติมในรูปแบบที่ไม่ระบุ

ฉันจะอธิบายประเด็นสุดท้ายเพราะมันขัดแย้งกับประเด็นแรกเล็กน้อย หากเราเปิดการสร้างภาพใดๆ ขึ้นมา ก็มีความเป็นไปได้ที่จะเกิดการโจมตีไซต์โดยสร้างคำขอจำนวนมากเพื่อปรับขนาดรูปภาพให้เป็นรูปแบบที่ไม่จำกัด ดังนั้นช่องโหว่นี้จึงต้องปิดลง

การกำหนดค่าการติดตั้ง 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'
                );

แม้ว่าฉันจะแนะนำให้คำนวณขนาดด้วย ภาพตัวอย่าง.

คราด

เมื่อลบรูปภาพต้นฉบับ การแสดงตัวอย่างจะไม่ถูกลบออกจากแคชตามธรรมชาติจนกว่าแคชจะใช้งานไม่ได้ และในกรณีของเรา การแสดงตัวอย่างสามารถคงอยู่ได้หนึ่งวันหลังจากการลบ แต่นี่คือเวลาสูงสุด

ต้นฉบับ

ที่มา: will.com

เพิ่มความคิดเห็น