เดˆเดšเตเดšเดฏเดฟเตฝ เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต† เดตเดฒเตเดชเตเดชเด‚ เดฎเดพเดฑเตเดฑเตเด•

เด‡เดฎเต‡เดœเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดเดคเตŠเดฐเต เดตเต†เดฌเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเดฒเตเด‚, เดˆ เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต† เดšเต†เดฑเดฟเดฏ เดชเด•เตผเดชเตเดชเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต, เด•เต‚เดŸเดพเดคเต† เด…เดงเดฟเด• เด‡เดฎเต‡เดœเตเด•เตพเด•เตเด•เดพเดฏเดฟ เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เดจเดฟเดฐเดตเดงเดฟ เดซเต‹เตผเดฎเดพเดฑเตเดฑเตเด•เตพ เด‰เดฃเตเดŸเต.
เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดชเตเดคเดฟเดฏ เดฎเดพเดจเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเตเด‚ เดšเดฟเดฒ เดคเดฒเดตเต‡เดฆเดจเด•เตพเด•เตเด•เต เด•เดพเดฐเดฃเดฎเดพเด•เตเดจเตเดจเต. เด…เดคเดฟเดจเดพเตฝ เดšเตเดฎเดคเดฒ:

เดฒเด•เตเดทเตเดฏเด‚

เด†เดตเดถเตเดฏเด•เดคเด•เดณเตเดŸเต† เดชเดŸเตเดŸเดฟเด• เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚:

  • เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เด…เดธเตเดคเดฟเดคเตเดตเดคเตเดคเดฟเตฝ เดŽเดชเตเดชเต‹เตพ เดตเต‡เดฃเดฎเต†เด™เตเด•เดฟเดฒเตเด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เด…เดงเดฟเด• เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เดพเดคเต† เดคเดจเตเดจเต† เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตปเตเดฑเต† เด…เดงเดฟเด• เดšเดฟเดคเตเดฐเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•;
  • เด“เดฐเต‹ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเดฟเดฒเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดšเดฟเดคเตเดฐเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ;
  • เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดพเดคเตเดค เดซเต‹เตผเดฎเดพเดฑเตเดฑเตเด•เดณเตเดŸเต† เด…เดงเดฟเด• เดšเดฟเดคเตเดฐเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด•เดดเดฟเดตเต เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เตเด•.

เด…เดตเดธเดพเดจ เดชเต‹เดฏเดฟเตปเตเดฑเต เดžเดพเตป เดตเดฟเดถเดฆเต€เด•เดฐเดฟเด•เตเด•เตเด‚, เด•เดพเดฐเดฃเด‚ เด‡เดคเต เด†เดฆเตเดฏ เดชเต‹เดฏเดฟเตปเตเดฑเตเดฎเดพเดฏเดฟ เดšเต†เดฑเตเดคเดพเดฏเดฟ เดตเดฟเดฐเตเดฆเตเดงเดฎเดพเดฃเต. เดžเด™เตเด™เตพ เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต† เดœเดจเดฑเต‡เดทเตป เด“เดชเตเดชเตบ เด†เด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด…เดจเดจเตเดคเดฎเดพเดฏ เดซเต‹เตผเดฎเดพเดฑเตเดฑเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดšเดฟเดคเตเดฐเดคเตเดคเดฟเตปเตเดฑเต† เดตเดฒเตเดชเตเดชเด‚ เดฎเดพเดฑเตเดฑเดพเตป เดงเดพเดฐเดพเดณเด‚ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดธเตƒเดทเตเดŸเดฟเดšเตเดšเต เดธเตˆเดฑเตเดฑเดฟเตฝ เด†เด•เตเดฐเดฎเดฃเดคเตเดคเดฟเดจเต เดธเดพเดงเตเดฏเดคเดฏเตเดฃเตเดŸเต, เด…เดคเดฟเดจเดพเตฝ เดˆ เด…เดชเด•เดŸเดธเดพเดงเตเดฏเดค เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

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 - เด‡เดŸเด™เตเด™เดณเต‹เดŸเตเด‚ เดฑเดทเตเดฏเตป เดชเตเดฐเดคเต€เด•เด™เตเด™เดณเต‹เดŸเตเด‚ เดธเต†เตปเดธเดฟเดฑเตเดฑเต€เดตเต, เด…เดคเดฟเดจเดพเตฝ เดŽเดจเดฟเด•เตเด•เต เด’เดฐเต เดŠเดจเตเดจเตเดตเดŸเดฟ เด‰เดฃเตเดŸเดพเด•เตเด•เต‡เดฃเตเดŸเดฟ เดตเดจเตเดจเต เด…เดชเดฐเดพเดญเดฟเดงเดพเดจเด‚.

เด’เดฐเต เดตเต†เดฌเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•

เดตเต†เดฌเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดคเดฒเดคเตเดคเดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดจเดŸเดชเดŸเดฟเด•เตเดฐเดฎเด‚ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚ (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'
                );

เดตเดฒเตเดชเตเดชเด™เตเด™เตพ เด•เดฃเด•เตเด•เดพเด•เตเด•เดพเดจเตเด‚ เดžเดพเตป เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเตเดฃเตเดŸเต†เด™เตเด•เดฟเดฒเตเด‚ เดชเตเดฐเดฟเดตเตเดฏเต‚.

เดฑเต‡เด•เตเด•เต

เดฏเดฅเดพเตผเดคเตเดฅ เดšเดฟเดคเตเดฐเด‚ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด•เดพเดทเต† เด…เดธเดพเดงเตเดตเดพเด•เตเดจเตเดจเดคเตเดตเดฐเต† เดชเตเดฐเดฟเดตเตเดฏเต‚เด•เตพ เดธเตเดตเดพเดญเดพเดตเดฟเด•เดฎเดพเดฏเตเด‚ เด•เดพเดทเต†เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดฟเดฒเตเดฒ, เดžเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดฟเดฏเดคเดฟเดจเต เดถเต‡เดทเด‚ เด’เดฐเต เดฆเดฟเดตเดธเดคเตเดคเต‡เด•เตเด•เต เดชเตเดฐเดฟเดตเตเดฏเต‚เด•เตพ เดจเดฟเดฒเดจเดฟเตฝเด•เตเด•เตเด‚, เดŽเดจเตเดจเดพเตฝ เด‡เดคเต เดชเดฐเดฎเดพเดตเดงเดฟ เดธเดฎเดฏเดฎเดพเดฃเต.

เดฏเดฅเดพเตผเดคเตเดฅเดฎเดพเดฏเดคเต

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•