Feroarje ôfbyldings ûnderweis mei Nginx en LuaJIT (OpenResty)

Al in hiel skoft no, ynspirearre troch it artikel Feroarje ôfbyldings op 'e flecht image resize waard konfigurearre mei ngx_http_image_filter_module en alles wurke sa't it moat. Mar ien probleem ûntstie doe't de manager ôfbyldings moast ûntfange mei krekte dimensjes foar it uploaden nei guon tsjinsten, om't ... dit wiene harren technyske easken. Bygelyks, as wy in orizjinele ôfbylding fan grutte hawwe 1200 × 1200, en by it feroarjen fan grutte skriuwe wy wat as ?grutte=600×400, dan krije wy in evenredich fermindere ôfbylding lâns de lytste râne, grutte 400 × 400. It is ek ûnmooglik om in ôfbylding te krijen mei in hegere resolúsje (upscale). Dy. ?grutte=1500×1500 sil deselde ôfbylding weromjaan 1200 × 1200

Dit artikel kaam ta de rêding OpenResty: NGINX omsette yn in folweardige applikaasjetsjinner om te begripen hoe't Nginx wurket mei Lua en de bibleteek sels foar Lua isage/lua-imagegick - Lua pure-c bindingen oan ImageMagick. Wêrom is dizze oplossing keazen, en net, sis, wat yn python - om't it fluch en handich is. Jo hoege net iens bestannen oan te meitsjen, alles is goed yn 'e Nginx-konfiguraasje (opsjoneel).

Dus wat hawwe wy nedich

Foarbylden sille wurde jûn op basis fan Debian.

Ynstallaasje fan nginx en nginx-ekstra's

apt-get update
apt-get install nginx-extras

Ynstallaasje fan LuaJIT

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

Ynstallaasje fan imagemagick

apt-get -y install imagemagick

en biblioteken magicwand oan it, yn myn gefal foar ferzje 6

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

Bouwe lua-imaging

Wy klonje it repository (of nim de zip en útpakke it)

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

As alles goed gie, kinne jo Nginx konfigurearje.

Ik sil in foarbyld jaan fan 'e konfiguraasje fan' e backend-host, dy't yn feite ferantwurdlik is foar it feroarjen fan grutte. It wurdt proxed troch de front tsjinner, ek mei Nginx, dêr't caching foar in bepaalde perioade fan tiid (dagen) en oare dingen.

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

Wat wie nedich (útwreidzje it byld om 'e rânen) bart mei help img:extent() en wurdt definiearre mei de parameter resize mei in teken + oan de ein.

De folgjende opsjes binne beskikber:

  • WxH (Hâld aspekt-ferhâlding, brûk hegere dimensje)
  • WxH^ (Hâld aspekt-ferhâlding, brûk legere dimensje (gewaaks))
  • WxH! (Negearje aspektferhâlding)
  • WxH+ (Hâld aspektferhâlding, foegje sydgrinzen ta)

Gearfetting tabel mei resize resultaten

Uri-parameter oanfreegje
Output Image Grutte

?grutte=400×200
200 × 200

?grutte=400×200^
400 × 400

?grutte feroarje=400×200!
400 × 200 (Net evenredich)

?grutte feroarje=400×200+
400 × 200 (proporsjoneel)

Feroarje ôfbyldings ûnderweis mei Nginx en LuaJIT (OpenResty)

It resultaat

Sjoen de krêft en ienfâld fan dizze oanpak, kinne jo dingen útfiere mei frij komplekse logika, bygelyks wettermerken tafoegje of autorisaasje útfiere mei beheinde tagong. Om de mooglikheden fan 'e API te finen foar it wurkjen mei ôfbyldings, kinne jo ferwize nei de biblioteekdokumintaasje isage/lua-imagegick

Boarne: www.habr.com

Add a comment