рдЙрдбрд╛рдирдорд╛ рдЫрд╡рд┐рд╣рд░реВрдХреЛ рдЖрдХрд╛рд░ рдмрджрд▓реНрдиреБрд╣реЛрд╕реН

рдЫрд╡рд┐рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рд▓рдЧрднрдЧ рдХреБрдиреИ рдкрдирд┐ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧрдорд╛, рдпреА рдЫрд╡рд┐рд╣рд░реВрдХреЛ рд╕рд╛рдиреЛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рд░ рдкреНрд░рд╛рдп: рддреНрдпрд╣рд╛рдБ рдЕрддрд┐рд░рд┐рдХреНрдд рдЫрд╡рд┐рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рдврд╛рдБрдЪрд╛рд╣рд░реВ рдЫрдиреНред
рдЕрд╡рд╕реНрдерд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧрдорд╛ рдирдпрд╛рдБ рдЖрдпрд╛рдорд╣рд░реВ рдердкреНрджрд╛ рдХреЗрд╣реА рдЯрд╛рдЙрдХреЛ рджреБрдЦрд╛рдЗ рдкрдирд┐ рд╣реБрдиреНрдЫред рддреНрдпрд╕реИрд▓реЗ рдХрд╛рд░реНрдп:

рдЙрджреНрджреЗрд╢реНрдп

рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВрдХреЛ рд╕реВрдЪреА рдмреБрдЭреМрдВ:

  • рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рдЕрд╕реНрддрд┐рддреНрд╡рдХреЛ рдмрдЦрдд рдХреБрдиреИ рдкрдирд┐ рд╕рдордпрдорд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдорд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░рд┐рдЪрдп рдирдЧрд░реА рдЙрдбрд╛рдирдорд╛ рдХреБрдиреИ рдкрдирд┐ рдврд╛рдБрдЪрд╛рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЫрд╡рд┐рд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреБрд╣реЛрд╕реН;
  • рдЕрддрд┐рд░рд┐рдХреНрдд рдЫрд╡рд┐рд╣рд░реВ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдзрдорд╛ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрди;
  • рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдврд╛рдБрдЪрд╛рд╣рд░реВрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЫрд╡рд┐рд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛рд▓рд╛рдИ рдЕрд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рдо рдЕрдиреНрддрд┐рдо рдмрд┐рдиреНрджреБрдХреЛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░реНрдиреЗрдЫреБ, рдХрд┐рдирдХрд┐ рдпрд╕рд▓реЗ рдкрд╣рд┐рд▓реЛ рдмрд┐рдиреНрджреБрд╕рдБрдЧ рдереЛрд░реИ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдЧрд░реНрджрдЫред рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдХреБрдиреИ рдкрдирд┐ рдЫрд╡рд┐рд╣рд░реВрдХреЛ рдЬреЗрдиреЗрд░реЗрд╕рди рдЦреБрд▓рд╛ рдмрдирд╛рдпреМрдВ рднрдиреЗ, рдЫрд╡рд┐рд▓рд╛рдИ рдЕрд╕реАрдо рд╕рдВрдЦреНрдпрд╛рдорд╛ рдврд╛рдБрдЪрд╛рдорд╛ рдкреБрди: рдЖрдХрд╛рд░ рджрд┐рдирдХреЛ рд▓рд╛рдЧрд┐ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реЗрд░ рд╕рд╛рдЗрдЯрдорд╛ рдЖрдХреНрд░рдордгрдХреЛ рд╕рдореНрднрд╛рд╡рдирд╛ рдЫ, рддреНрдпрд╕реИрд▓реЗ рдпреЛ рдЬреЛрдЦрд┐рдорд▓рд╛рдИ рдмрдиреНрдж рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

nginx рд╕реНрдерд╛рдкрдирд╛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди

рдорд╛рдерд┐рдХрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╣рд╛рдореАрд▓рд╛рдИ nginx рдореЛрдбреНрдпреБрд▓рд╣рд░реВрдХреЛ рдирд┐рдореНрди рд╕реЗрдЯ рдЪрд╛рд╣рд┐рдиреНрдЫ:

  • ngx_http_image_filter_module - рдЫрд╡рд┐рд╣рд░реВ рд░рд┐рд╕рд╛рдЗрдЬ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐;
  • ngx_http_proxy_module - рдХреНрдпрд╛рд╕рд┐рдЩ рд▓рд╛рдЧрд┐;
  • ngx_http_secure_link_module - рд╕реНрдкреНрдпрд╛рдо рд╡рд┐рд░реБрджреНрдз рд╕реБрд░рдХреНрд╖рд╛ рдЧрд░реНрди;

рдореЛрдбреНрдпреБрд▓рд╣рд░реВ 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 тАФ рд╕реНрдкреЗрд╕ рд░ рд░реВрд╕реА рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд╣рд░реВрдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓, рддреНрдпрд╕реИрд▓реЗ рдореИрд▓реЗ рдПрдЙрдЯрд╛ рдмреИрд╕рд╛рдЦреА рдмрдирд╛рдЙрдиреБрдкрд░реНтАНрдпреЛ рдЙрдкрдирд╛рдо.

рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрддрд░рдорд╛, рддрдкрд╛рдЗрдБ рдирд┐рдореНрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдкрд░реНрд▓) рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди