Hlaziya ubungakanani bemifanekiso kubhabho

Phantse nasiphi na isicelo sewebhu esisebenzisa imifanekiso, kukho imfuneko yokwenza iikopi ezincinci zale mifanekiso, kwaye kaninzi kukho iifomati ezininzi zemifanekiso eyongezelelweyo.
Ukongeza imilinganiselo emitsha kwisicelo esele sikhona kubangela iintloko ezibuhlungu. Ngoko ke umsebenzi:

Injongo

Masibonise uluhlu lweemfuno:

  • Yenza imifanekiso eyongezelelweyo yayo nayiphi na ifomathi kwi-fly ngaphandle kokwazisa ukusebenza okongeziweyo kwisicelo nangaliphi na ixesha ngexesha lobukho besicelo;
  • Imifanekiso eyongezelelweyo ayifuni ukuba yenziwe kwisicelo ngasinye;
  • Khubaza ukukwazi ukwenza imifanekiso eyongezelelweyo yeefomati ezingachazwanga.

Ndiza kucacisa inqaku lokugqibela, kuba liphikisana nenqaku lokuqala. Ukuba senza isizukulwana sayo nayiphi na imifanekiso evulekileyo, ngoko kukho ithuba lokuhlaselwa kwisayithi ngokuvelisa inani elikhulu lezicelo zokutshintsha ubungakanani bomfanekiso kwinani elingenasiphelo lefomathi, ngoko ke lo mngcipheko kufuneka uvalwe.

nginx uqwalaselo lofakelo

Ukusombulula ezi mfuno zingasentla sifuna le seti ilandelayo yeemodyuli ze-nginx:

I modyuli ngx_http_image_isihluzi_modyuli ΠΈ ngx_http_secure_link_modyuli azifakwanga ngokungagqibekanga, ngoko ke kufuneka zichazwe kwinqanaba loqwalaselo lofakelo nginx:

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

nginx uqwalaselo

Songeza entsha kuqwalaselo lwethu lokusingatha indawo kunye neeparamitha ze-cache ngokubanzi:

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

Sikwangeza umamkeli omtsha kuqwalaselo:

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

Ngenxa yoko, imifanekiso eyongezelelweyo inokufumaneka kusetyenziswa la makhonkco alandelayo:

* zama_iifayile - ubuthathaka kwizithuba kunye nabalinganiswa baseRashiya, ngoko ke kwafuneka ndenze intonga ogama limbi.

Sebenzisa kwisicelo sewebhu

Kwinqanaba lesicelo sewebhu, unokwenza le nkqubo ilandelayo (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'
                );

Nangona ndingaphinda ndicebise ukubala ubungakanani yemboniso.

Qhekeza

Xa ucima umfanekiso wokuqala, ukujonga kuqala, ngokwemvelo, akuyi kususwa kwi-cache de i-cache ingasebenzi, kwaye kwimeko yethu, ukujonga kuqala kunokubakho ngosuku emva kokususwa, kodwa eli lixesha eliphezulu.

eyokuqala

umthombo: www.habr.com

Yongeza izimvo