ΠŸΡ€ΠΎΠΌΠ΅Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅ сликС Ρƒ Ρ…ΠΎΠ΄Ρƒ

Π£ скоро свакој Π²Π΅Π± Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜ΠΈ која користи сликС ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π΄Π° сС ΠΊΡ€Π΅ΠΈΡ€Π°Ρ˜Ρƒ ΠΌΠ°Π»Π΅ копијС ΠΎΠ²ΠΈΡ… слика, Π° чСсто ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π·Π° Π΄ΠΎΠ΄Π°Ρ‚Π½Π΅ сликС.
Π”ΠΎΠ΄Π°Π²Π°ΡšΠ΅ Π½ΠΎΠ²ΠΈΡ… димСнзија ΠΏΠΎΡΡ‚ΠΎΡ˜Π΅Ρ›ΠΎΡ˜ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜ΠΈ Ρ‚Π°ΠΊΠΎΡ’Π΅ ΠΈΠ·Π°Π·ΠΈΠ²Π° Π½Π΅ΠΊΠ΅ Π³Π»Π°Π²ΠΎΠ±ΠΎΡ™Π΅. ΠžΡ‚ΡƒΠ΄Π° Π·Π°Π΄Π°Ρ‚Π°ΠΊ:

Π—Π°Π΄Π°Ρ‚Π°ΠΊ

ΠžΠ·Π½Π°Ρ‡ΠΈΠΌΠΎ листу Π·Π°Ρ…Ρ‚Π΅Π²Π°:

  • Π“Π΅Π½Π΅Ρ€ΠΈΡˆΠΈΡ‚Π΅ Π΄ΠΎΠ΄Π°Ρ‚Π½Π΅ сликС Π±ΠΈΠ»ΠΎ ΠΊΠΎΠ³ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Ρƒ Ρ…ΠΎΠ΄Ρƒ Π±Π΅Π· ΡƒΠ²ΠΎΡ’Π΅ΡšΠ° Π΄ΠΎΠ΄Π°Ρ‚Π½Π΅ функционалности Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ Ρƒ Π±ΠΈΠ»ΠΎ ΠΊΠΎΠΌ Ρ‚Ρ€Π΅Π½ΡƒΡ‚ΠΊΡƒ Ρ‚ΠΎΠΊΠΎΠΌ ΠΏΠΎΡΡ‚ΠΎΡ˜Π°ΡšΠ° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅;
  • Π”ΠΎΠ΄Π°Ρ‚Π½Π΅ сликС Π½Π΅ ΠΌΠΎΡ€Π°Ρ˜Ρƒ Π΄Π° сС Π³Π΅Π½Π΅Ρ€ΠΈΡˆΡƒ Π½Π° сваки Π·Π°Ρ…Ρ‚Π΅Π²;
  • ΠžΠ½Π΅ΠΌΠΎΠ³ΡƒΡ›ΠΈΡ‚Π΅ могућност Π³Π΅Π½Π΅Ρ€ΠΈΡΠ°ΡšΠ° Π΄ΠΎΠ΄Π°Ρ‚Π½ΠΈΡ… слика Π½Π΅ΠΎΠ΄Ρ€Π΅Ρ’Π΅Π½ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°.

ΠžΠ±Ρ˜Π°ΡΠ½ΠΈΡ›Ρƒ ΠΏΠΎΡΠ»Π΅Π΄ΡšΡƒ Ρ‚Π°Ρ‡ΠΊΡƒ, Ρ˜Π΅Ρ€ јС ΠΌΠ°Π»ΠΎ Ρƒ супротности са ΠΏΡ€Π²ΠΎΠΌ Ρ‚Π°Ρ‡ΠΊΠΎΠΌ. Ако Π³Π΅Π½Π΅Ρ€ΠΈΡΠ°ΡšΠ΅ Π±ΠΈΠ»ΠΎ којС сликС ΡƒΡ‡ΠΈΠ½ΠΈΠΌΠΎ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈΠΌ, ΠΎΠ½Π΄Π° ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ могућност Π½Π°ΠΏΠ°Π΄Π° Π½Π° ΡΠ°Ρ˜Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡΠ°ΡšΠ΅ΠΌ Π²Π΅Π»ΠΈΠΊΠΎΠ³ Π±Ρ€ΠΎΡ˜Π° Π·Π°Ρ…Ρ‚Π΅Π²Π° Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Ρƒ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅ сликС Ρƒ бСсконачан Π±Ρ€ΠΎΡ˜ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, Ρ‚Π°ΠΊΠΎ Π΄Π° ΠΎΠ²Ρƒ Ρ€Π°ΡšΠΈΠ²ΠΎΡΡ‚ Ρ‚Ρ€Π΅Π±Π° Π·Π°Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΠΈ.

Π½Π³ΠΈΠ½ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ΠΈΠ½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π΅

Π”Π° бисмо Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π³ΠΎΡ€Π΅ Π½Π°Π²Π΅Π΄Π΅Π½Π΅ Π·Π°Ρ…Ρ‚Π΅Π²Π΅, ΠΏΠΎΡ‚Ρ€Π΅Π±Π°Π½ Π½Π°ΠΌ јС слСдСћи скуп Π½Π³ΠΈΠ½ΠΊ ΠΌΠΎΠ΄ΡƒΠ»Π°:

ΠœΠΎΠ΄ΡƒΠ»ΠΈ Π½Π³ΠΊ_Ρ…Ρ‚Ρ‚ΠΏ_ΠΈΠΌΠ°Π³Π΅_Ρ„ΠΈΠ»Ρ‚Π΅Ρ€_ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΠΈ Π½Π³ΠΊ_Ρ…Ρ‚Ρ‚ΠΏ_сСцурС_Π»ΠΈΠ½ΠΊ_ΠΌΠΎΠ΄ΡƒΠ»Π΅ нису ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π½ΠΎ инсталирани, Ρ‚Π°ΠΊΠΎ Π΄Π° ΠΌΠΎΡ€Π°Ρ˜Ρƒ Π±ΠΈΡ‚ΠΈ спСцифицирани Ρƒ Ρ„Π°Π·ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π΅ ΠΈΠ½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π΅ АпацхС:

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

Π½Π³ΠΈΠ½ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°

Π”ΠΎΠ΄Π°ΠΌΠΎ Π½ΠΎΠ²ΠΈ Ρƒ Π½Π°ΡˆΡƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Ρƒ хоста Π»ΠΎΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΈ ΠΎΠΏΡˆΡ‚ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ кСша:

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

Као Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Ρ‚ΠΎΠ³Π°, Π΄ΠΎΠ΄Π°Ρ‚Π½Π΅ сликС сС ΠΌΠΎΠ³Ρƒ Π΄ΠΎΠ±ΠΈΡ‚ΠΈ ΠΏΠΎΠΌΠΎΡ›Ρƒ слСдСћих Π²Π΅Π·Π°:

* Ρ‚Ρ€ΠΈ_филСс β€” осСтљив Π½Π° Ρ€Π°Π·ΠΌΠ°ΠΊΠ΅ ΠΈ рускС Π·Π½Π°ΠΊΠΎΠ²Π΅, ΠΏΠ° сам ΠΌΠΎΡ€Π°ΠΎ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΡˆΡ‚Π°ΠΊΡƒ Π·Π²Π°Π½ΠΈ.

ΠšΠΎΡ€ΠΈΡΡ‚ΠΈΡ‚Π΅ Ρƒ Π²Π΅Π± Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜ΠΈ

На Π½ΠΈΠ²ΠΎΡƒ Π²Π΅Π± Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡƒΡ€Π°Π΄ΠΈΡ‚Π΅ слСдСћу ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ (ΠŸΠ΅Ρ€Π»):

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

Иако Π±ΠΈΡ… Ρ‚Π°ΠΊΠΎΡ’Π΅ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡƒΡ‡ΠΈΠΎ ΠΈΠ·Ρ€Π°Ρ‡ΡƒΠ½Π°Π²Π°ΡšΠ΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° ΠŸΡ€Π΅Π³Π»Π΅Π΄.

Π Π°ΠΊΠ΅

ΠŸΡ€ΠΈΠ»ΠΈΠΊΠΎΠΌ Π±Ρ€ΠΈΡΠ°ΡšΠ° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π΅ сликС, ΠΏΡ€Π΅Π³Π»Π΅Π΄ΠΈ, Π½Π°Ρ€Π°Π²Π½ΠΎ, Π½Π΅Ρ›Π΅ Π±ΠΈΡ‚ΠΈ обрисани ΠΈΠ· кСша Π΄ΠΎΠΊ сС кСш Π½Π΅ ΠΏΠΎΠ½ΠΈΡˆΡ‚ΠΈ, Π°Ρƒ нашСм ΡΠ»ΡƒΡ‡Π°Ρ˜Ρƒ ΠΏΡ€Π΅Π³Π»Π΅Π΄ΠΈ ΠΌΠΎΠ³Ρƒ ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ΠΈ Π΄Π°Π½ Π½Π°ΠΊΠΎΠ½ Π±Ρ€ΠΈΡΠ°ΡšΠ°, Π°Π»ΠΈ ΠΎΠ²ΠΎ јС максимално Π²Ρ€Π΅ΠΌΠ΅.

originalni

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€