Yenza ubungakanani kwakhona bemifanekiso kubhabho usebenzisa iNginx kunye neLuaJIT (OpenResty)

Ixesha elide ngoku, iphefumlelwe linqaku Hlaziya ubungakanani bemifanekiso kubhabho umlinganiselo womfanekiso wamiselwa kusetyenziswa ngx_http_image_isihluzi_modyuli kwaye yonke into yasebenza njengoko kufanele. Kodwa enye ingxaki yavela xa umphathi efuna ukufumana imifanekiso enemilinganiselo echanekileyo yokulayisha kwezinye iinkonzo, kuba... ezi yayiziimfuno zabo zobugcisa. Umzekelo, ukuba sinomfanekiso wokuqala wobungakanani 1200 Γ— 1200, kwaye xa uhlengahlengiso sibhala into enje ?ubungakanani=600Γ—400, emva koko sifumana umfanekiso oncitshisiweyo ngokulinganayo ecaleni komphetho omncinci, ubungakanani 400 Γ— 400. Kwakhona akunakwenzeka ukufumana umfanekiso kunye nesisombululo esiphezulu (upscale). Ezo. ?ubungakanani=1500Γ—1500 izakubuyisela umfanekiso ofanayo 1200 Γ— 1200

Eli nqaku laba luncedo I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo ukuqonda indlela iNginx esebenza ngayo noLua kunye nethala leencwadi ngokwalo leLua isage/lua-imagick -Lua pure-c izibophelelo kwi ImageMagick. Kutheni le nto isisombululo sikhethwe, kwaye kungekhona, sithi, into e-python - kuba ikhawuleza kwaye ifanelekile. Awudingi nokuba wenze naziphi na iifayile, yonke into ilungile kwi-Nginx config (ukhetho).

Ngoko sifuna ntoni

Imizekelo iya kunikwa ngokusekelwe kwiDebian.

Ukufaka i-nginx kunye ne-nginx-ezongezelelweyo

apt-get update
apt-get install nginx-extras

Ifakela i-LuaJIT

apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-dev

Kuhlohlwa i-imagemagick

apt-get -y install imagemagick

kunye namathala eencwadi magickwand kuyo, kwimeko yam yenguqulo yesi-6

apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev

Ukwakha i-lua-imagick

Sidibanisa indawo yokugcina (okanye sithathe i-zip kwaye siyikhulule)

cd ~
git clone https://github.com/isage/lua-imagick.git
cd lua-imagick
mkdir build
cd build
cmake ..
make
make install

Ukuba yonke into ihambe kakuhle, ungaqwalasela iNginx.

Ndiza kunika umzekelo we-config ye-backend host host, leyo, eneneni, inoxanduva lokunciphisa ubungakanani. Iproxied ngumncedisi wangaphambili, kunye ne-Nginx, apho i-caching yenzeke ixesha elithile (iintsuku) kunye nezinye izinto.

nginx backend config

# Backend image server
server {
    listen       8082;
    listen [::]:8082;
    set $files_root /var/www/example.lh/frontend/web;
    root $files_root;
    access_log off;
    expires 1d;

    location /files {
        # Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Π΅ значСния рСсайза
        set $w 700;
        set $h 700;
        set $q 89;

        #1-89 allowed
        if ($arg_q ~ "^([1-9]|[1-8][0-9])$") {
            set $q $arg_q;
        }

        if ($arg_resize ~ "([d-]+)x([d+!^]+)") {  
            set $w $1;
            set $h $2;
            rewrite  ^(.*)$   /resize/$w/$h/$q$uri     last;
        }

        rewrite  ^(.*)$   /resize/$w/$h/$q$uri     last;
    }

    location ~* ^/resize/([d]+)/([d+!^]+)/([d]+)/files/(.+)$ {
        default_type 'text/plain';

        set $w $1;
        set $h $2;
        set $q $3;
        set $fname $4;

        # Π•ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ вынСсти вСсь Lua ΠΊΠΎΠ΄ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»
        # content_by_lua_file /var/www/some.lua;
        # lua_code_cache off; #dev
        content_by_lua '
        local magick = require "imagick"
        local img = magick.open(ngx.var.files_root .. "/files/" .. ngx.var.fname)
        if not img then ngx.exit(ngx.HTTP_NOT_FOUND) end
        img:set_gravity(magick.gravity["CenterGravity"])

        if string.match(ngx.var.h, "%d+%+") then
            local h = string.gsub(ngx.var.h, "(%+)", "")
            resize = ngx.var.w .. "x" .. h
            -- для png с Π°Π»ΡŒΡ„Π° ΠΊΠ°Π½Π°Π»ΠΎΠΌ
            img:set_bg_color(img:has_alphachannel() and "none" or img:get_bg_color())
            img:smart_resize(resize)
            img:extent(ngx.var.w, h)
        else
                img:smart_resize(ngx.var.w .. "x" .. ngx.var.h)
        end

        if ngx.var.arg_q then img:set_quality(ngx.var.q) end

        ngx.say(img:blob())
        ';
    }
}

# Upstream
upstream imageserver {
    server localhost:8082;
}

server {
    listen 80;
    server_name examaple.lh;

    # отправляСм всС jpg ΠΈ png ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π½Π° imageserver
    location ~* ^/files/.+.(jpg|png) {
        proxy_buffers 8 2m;
        proxy_buffer_size 10m;
        proxy_busy_buffers_size 10m;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass     http://imageserver;  # Backend image server
    }
}

Okufunekayo (ukwandisa umfanekiso ojikeleze imiphetho) kwenzeka usebenzisa img:extent() kwaye ichazwa kusetyenziswa iparamitha resize ngomqondiso + ekugqibeleni.

Olu khetho lulandelayo luyafumaneka:

  • WxH (Gcina inkangeleko-retiyo, sebenzisa idimension ephezulu)
  • WxH^ (Gcina imbonakalo yomlinganiselo, sebenzisa i-dimension esezantsi (isityalo)
  • WxH! (Ungayihoyi inkangeleko-yereyishini)
  • WxH+ (Gcina inkangeleko-retiyo, yongeza imida esecaleni)

Itheyibhile yesishwankathelo eneziphumo zohlengahlengiso

Cela ipharamitha ye-uri
Ubungakanani boMfanekiso wemveliso

?ubungakanani=400Γ—200
200 Γ— 200

?ubungakanani=400Γ—200^
400 Γ— 400

?ubungakanani=400Γ—200!
400Γ—200 (Ayilingani)

?ubungakanani =400Γ—200+
400Γ—200 (Ngokulinganisela)

Yenza ubungakanani kwakhona bemifanekiso kubhabho usebenzisa iNginx kunye neLuaJIT (OpenResty)

Isiphumo

Ukuqwalasela amandla kunye nokulula kwale ndlela, unokuphumeza izinto ngengqiqo enzima kakhulu, umzekelo, ukongeza ii-watermark okanye ukuphumeza ugunyaziso olunokufikelela okulinganiselweyo. Ukufumana izakhono ze-API zokusebenza ngemifanekiso, unokubhekisela kumaxwebhu ethala leencwadi isage/lua-imagick

umthombo: www.habr.com

Yongeza izimvo