Usba ang gidak-on sa mga hulagway gamit ang Nginx ug LuaJIT (OpenResty)

Sulod sa pipila ka panahon karon, nadasig sa artikulo Ang pag-resize sa imahe sa langaw Ang pagbag-o sa imahe gi-configure gamit ang ngx_http_image_filter_module ug ang tanan nagtrabaho ingon nga kini kinahanglan. Apan usa ka problema ang mitungha kung ang manedyer kinahanglan nga makadawat mga imahe nga adunay eksaktong mga sukat alang sa pag-upload sa pipila nga mga serbisyo, tungod kay... kini mao ang ilang teknikal nga mga kinahanglanon. Pananglitan, kon kita adunay orihinal nga hulagway sa gidak-on 1200 Γ— 1200, ug kung gibag-o ang gidak-on nagsulat kami sama sa ?resize=600Γ—400, unya makakuha kami usa ka proporsyonal nga pagkunhod sa imahe sa pinakagamay nga ngilit, gidak-on 400 Γ— 400. Imposible usab nga makakuha og imahe nga adunay mas taas nga resolusyon (upscale). Mga. ?resize=1500Γ—1500 ibalik ang parehas nga imahe 1200 Γ— 1200

Kini nga artikulo mitabang sa pagluwas OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon aron masabtan kung giunsa ang Nginx nagtrabaho kauban si Lua ug ang librarya mismo alang sa Lua isage/lua-imagick - Lua pure-c bindings sa ImageMagick. Ngano nga kini nga solusyon gipili, ug dili, ingon, usa ka butang sa python - tungod kay kini paspas ug kombenyente. Dili nimo kinahanglan nga maghimo bisan unsang mga file, ang tanan naa sa Nginx config (opsyonal).

Busa unsa ang atong gikinahanglan

Ang mga pananglitan ihatag base sa Debian.

Pag-instalar sa nginx ug nginx-extras

apt-get update
apt-get install nginx-extras

Pag-instalar sa LuaJIT

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

Pag-instalar sa imagemagic

apt-get -y install imagemagick

ug mga librarya magickwand niini, sa akong kaso alang sa bersyon 6

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

Pagtukod og lua-imagick

Gi-clone namon ang repository (o kuhaa ang zip ug i-unpack kini)

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

Kung maayo ang tanan, mahimo nimong i-configure ang Nginx.

Maghatag ako usa ka pananglitan sa config sa backend host, nga, sa tinuud, responsable sa pagbag-o sa laki. Giproxy kini sa front server, kauban usab sa Nginx, diin ang caching mahitabo sa usa ka piho nga yugto sa panahon (mga adlaw) ug uban pang mga butang.

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

Unsa ang gikinahanglan (pagpalapad sa imahe sa palibot sa mga sulud) mahitabo gamit img:extent() ug gihubit gamit ang parameter resize nga may timaan + sa katapusan.

Ang mosunod nga mga opsyon anaa:

  • WxH (Ipadayon ang aspect-ratio, gamita ang mas taas nga dimensyon)
  • WxH^ (Ipadayon ang aspect-ratio, gamita ang ubos nga dimensyon (crop))
  • WxH! (Ibaliwala ang aspect-ratio)
  • WxH+ (Ipadayon ang aspect-ratio, idugang ang mga utlanan sa kilid)

Summary table nga adunay mga resulta sa pag-resize

Pangayo ug uri parameter
Gidak-on sa Hulagway sa Output

?resize=400Γ—200
200 Γ— 200

?resize=400Γ—200^
400 Γ— 400

?resize=400Γ—200!
400 Γ— 200 (Dili proporsyonal)

?resize=400Γ—200+
400Γ—200 (Proporsyonal)

Usba ang gidak-on sa mga hulagway gamit ang Nginx ug LuaJIT (OpenResty)

Ang resulta

Sa pagkonsiderar sa gahum ug kayano sa kini nga pamaagi, mahimo nimong ipatuman ang mga butang nga adunay komplikado nga lohika, pananglitan, pagdugang mga watermark o pagpatuman sa pagtugot nga adunay limitado nga pag-access. Aron mahibal-an ang mga kapabilidad sa API alang sa pagtrabaho sa mga imahe, mahimo nimong i-refer ang dokumentasyon sa librarya isage/lua-imagick

Source: www.habr.com

Idugang sa usa ka comment