ื‘ื™ืœื“ ืจืขืกื™ื–ื™ื ื’ ืื•ื™ืฃ ื“ื™ ืคืœื™ืขืŸ

ืื™ืŸ ื›ึผืžืขื˜ ืงื™ื™ืŸ ื•ื•ืขื‘ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืึธืก ื ื™ืฆื˜ ื‘ื™ืœื“ืขืจ, ืขืก ืื™ื– ืึท ื ื•ื™ื˜ ืฆื• ืžืึทื›ืŸ ืงืœื™ื™ืŸ ืงืืคื™ืขืก ืคื•ืŸ ื“ื™ ื‘ื™ืœื“ืขืจ, ืื•ืŸ ืึธืคื˜ ืขืก ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ืคึฟืึธืจืžืึทื˜ื™ืจื•ื ื’ืขืŸ ืคึฟืึทืจ ื ืึธืš ื‘ื™ืœื“ืขืจ.
ืึทื“ื™ื ื’ ื ื™ื™ึท ื“ื™ืžืขื ืฉืึทื ื– ืฆื• ืึท ื™ื’ื–ื™ืกื˜ื™ื ื’ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื•ื™ืš ื– ืขื˜ืœืขื›ืข ื›ืขื“ื™ื™ืงืก. ื“ืขืจื™ื‘ืขืจ ื“ื™ ืึทืจื‘ืขื˜:

ืึทืจื‘ืขื˜

ื–ืืœ ืก ืึธื ื•ื•ื™ื™ึทื–ืŸ ื“ื™ ืจืฉื™ืžื” ืคื•ืŸ ื‘ืื“ืขืจืคืขื ื™ืฉืŸ:

  • ื“ื–ืฉืขื ืขืจื™ื™ื˜ ื ืึธืš ื‘ื™ืœื“ืขืจ ืคื•ืŸ ืงื™ื™ืŸ ืคึฟืึธืจืžืึทื˜ ืื•ื™ืฃ ื“ื™ ืคืœื™ืขืŸ ืึธืŸ ื™ื ื˜ืจืึธื•ื“ื•ืกื™ื ื’ ื ืึธืš ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™ ืื™ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ืŸ ืงื™ื™ืŸ ืฆื™ื™ื˜ ื‘ืขืฉืึทืก ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืก ืขืงื–ื™ืกื˜ืขื ืฅ;
  • ื ืึธืš ื‘ื™ืœื“ืขืจ ื˜ืึธืŸ ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ื–ื™ื™ืŸ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ืื•ื™ืฃ ื™ืขื“ืขืจ ื‘ืงืฉื”;
  • ื“ื™ืกื™ื™ื‘ืึทืœ ื“ื™ ืคื™ื™ื™ืงื™ื™ื˜ ืฆื• ื“ื–ืฉืขื ืขืจื™ื™ื˜ ื ืึธืš ื‘ื™ืœื“ืขืจ ืคื•ืŸ ื•ื ืกืคึผืขืกื™ืคื™ืขื“ ืคึฟืึธืจืžืึทื˜ื™ืจื•ื ื’ืขืŸ.

ืื™ืš ื•ื•ืขืœ ืžืกื‘ื™ืจ ื–ื™ื™ืŸ ื“ื™ ืœืขืฆื˜ืข ื ืงื•ื“ื”, ื•ื•ื™ื™ืœ ืขืก ืื™ื– ืื‘ื™ืกืœ ืกื•ืชืจ ื“ื™ ืขืจืฉื˜ืข ื ืงื•ื“ื”. ืื•ื™ื‘ ืžื™ืจ ืžืึทื›ืŸ ื“ื™ ื“ื•ืจ ืคื•ืŸ ืงื™ื™ืŸ ื‘ื™ืœื“ืขืจ ืขืคืขื ืขืŸ, ืขืก ืื™ื– ืึท ืžืขื’ืœืขื›ืงื™ื™ื˜ ืคื•ืŸ ืึท ื‘ืึทืคืึทืœืŸ ืื•ื™ืฃ ื“ืขื ืคึผืœืึทืฅ ื“ื•ืจืš ื“ื–ืฉืขื ืขืจื™ื™ื˜ื™ื ื’ ืึท ื’ืจื•ื™ืก ื ื•ืžืขืจ ืคื•ืŸ ืจื™ืงื•ื•ืขืก ืฆื• ืจืขืกื™ื–ืข ื“ื™ ื‘ื™ืœื“ ืื™ืŸ ืึท ื™ื ืคืึทื ืึทื˜ ื ื•ืžืขืจ ืคื•ืŸ ืคึฟืึธืจืžืึทื˜ื™ืจื•ื ื’ืขืŸ, ืึทื–ื•ื™ ื“ืขื ื•ื•ืึทืœื ืขืจืึทื‘ื™ืœื™ื˜ื™ ื“ืึทืจืฃ ื–ื™ื™ืŸ ืคืืจืžืื›ื˜.

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

ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ื ืึธืš ื‘ื™ืœื“ืขืจ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื‘ืืงื•ืžืขืŸ ืžื™ื˜ ื“ื™ ืคืืœื’ืขื ื“ืข ืœื™ื ืงืก:

  • myproject.ru/preview/i[ืžื“5]/[ืคึผืึทื˜_ืฆื•_ื‘ื™ืœื“]
  • myproject.ru/preview/c[ืžื“5] / [ื’ืจื™ื™ืก] / [ืคึผืึทื˜_ืฆื•_ื‘ื™ืœื“]
  • myproject.ru/preview/r[ืžื“5] / [ื’ืจื™ื™ืก] / [ืคึผืึทื˜_ืฆื•_ื‘ื™ืœื“]

* 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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’