Muutke piltide suurust lennult, kasutades Nginxi ja LuaJITi (OpenResty)

Juba mõnda aega artiklist inspireerituna Pildi suuruse muutmine käigult pildi suuruse muutmine seadistati kasutades ngx_http_image_filter_module ja kõik toimis nii nagu pidi. Kuid üks probleem tekkis siis, kui halduril oli vaja saada täpsete mõõtmetega pilte mõnesse teenusesse üleslaadimiseks, kuna... need olid nende tehnilised nõuded. Näiteks kui meil on originaalkujutis suuruses 1200 × 1200, ja suurust muutes kirjutame midagi sellist ?resize=600×400, siis saame proportsionaalselt vähendatud kujutise piki väikseimat serva, suurust 400 × 400. Samuti on võimatu saada suurema eraldusvõimega pilti (ülesskaala). Need. ?resize=1500×1500 tagastab sama pildi 1200 × 1200

See artikkel tuli appi OpenResty: NGINX-i muutmine täieõiguslikuks rakendusserveriks mõista, kuidas Nginx töötab Luaga ja Lua raamatukogu endaga isage/lua-imagick - Lua puhas-c köited ImageMagickile. Miks valiti just see lahendus, mitte näiteks midagi pythonis – sest see on kiire ja mugav. Te ei pea isegi faile looma, Nginxi konfiguratsioonis on kõik õige (valikuline).

Mida me siis vajame

Näiteid tuuakse Debiani põhjal.

Nginxi ja nginx-lisade installimine

apt-get update
apt-get install nginx-extras

LuaJITi installimine

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

Imagemagicki installimine

apt-get -y install imagemagick

ja raamatukogud võlukepp sellele, minu puhul versioonile 6

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

Lua-imagicki ehitamine

Kloonime hoidla (või võtame tõmbluku ja pakime selle lahti)

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

Kui kõik läks hästi, saate Nginxi konfigureerida.

Toon näite taustaprogrammi hosti konfiguratsioonist, mis tegelikult vastutab suuruse muutmise eest. Seda puhverdab eesserver, ka Nginxiga, kus vahemällu salvestamine toimub teatud aja jooksul (päevad) ja muud.

nginxi taustaprogrammi konfiguratsioon

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

Nõutav (pildi laiendamine servade ümber) toimub kasutades img:extent() ja on määratletud parameetri abil resize allkirjastatud + lõpus.

Saadaval on järgmised valikud.

  • LxK (säilitage kuvasuhe, kasutage suuremat mõõdet)
  • LxK^ (Säilitage kuvasuhe, kasutage väiksemat mõõdet (kärpimine))
  • PxK! (Ignoreeri kuvasuhet)
  • WxH+ (säilitage kuvasuhe, lisage külgmised äärised)

Kokkuvõttev tabel suuruse muutmise tulemustega

Küsi uri parameetrit
Väljundpildi suurus

?resize=400×200
200 × 200

?resize=400×200^
400 × 400

?resize=400×200!
400 × 200 (ei ole proportsionaalne)

?resize=400×200+
400 × 200 (proportsionaalne)

Muutke piltide suurust lennult, kasutades Nginxi ja LuaJITi (OpenResty)

Summaarne

Arvestades selle lähenemise võimsust ja lihtsust, saate rakendada asju üsna keerulise loogikaga, näiteks lisada vesimärke või rakendada piiratud juurdepääsuga autoriseerimist. API võimaluste väljaselgitamiseks piltidega töötamiseks võite vaadata raamatukogu dokumentatsiooni isage/lua-imagick

Allikas: www.habr.com

Lisa kommentaar