Sinthani zithunzi pa ntchentche pogwiritsa ntchito Nginx ndi LuaJIT (OpenResty)

Kwa nthawi ndithu tsopano, mouziridwa ndi nkhaniyi Chithunzi chikuchulukirachulukira kukula kwa chithunzi kudakonzedwa pogwiritsa ntchito ngx_http_image_filter_module ndipo zonse zinayenda momwe zimayenera. Koma vuto lina lidabuka pomwe manejala adafunikira kulandira zithunzi zokhala ndi miyeso yeniyeni kuti akweze ku mautumiki ena, chifukwa... izi zinali zofunikira zawo zaukadaulo. Mwachitsanzo, ngati tili ndi chithunzi choyambirira cha kukula 1200 Γ— 1200, ndipo posintha masinthidwe timalemba motere ?resize=600Γ—400, ndiye timapeza chithunzi chochepetsedwa molingana ndi m'mphepete mwake, kukula 400 Γ— 400. Ndizosathekanso kupeza chithunzi chokhala ndi mawonekedwe apamwamba (upscale). Iwo. ?resize=1500Γ—1500 adzabwezera chithunzi chomwecho 1200 Γ— 1200

Nkhaniyi inandithandiza kwambiri OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito kuti mumvetsetse momwe Nginx imagwirira ntchito ndi Lua komanso laibulale yokha ya Lua isage/lua-imagick - Zomangira za Lua pure-c ku ImageMagick. Chifukwa chiyani yankholi linasankhidwa, osati, kunena, chinachake mu python - chifukwa ndichofulumira komanso chothandiza. Simufunikanso kupanga mafayilo aliwonse, zonse zili bwino mu Nginx config (posankha).

Ndiye tikusowa chiyani

Zitsanzo zidzaperekedwa kutengera Debian.

Kuyika nginx ndi nginx-zowonjezera

apt-get update
apt-get install nginx-extras

Kukhazikitsa LuaJIT

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

Kukhazikitsa imagemagick

apt-get -y install imagemagick

ndi malaibulale magickwand kwa izo, mu nkhani yanga ya version 6

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

Kumanga lua-imagick

Timagwirizanitsa nkhokwe (kapena kutenga zip ndikumasula)

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

Ngati zonse zidayenda bwino, mutha kukonza Nginx.

Ndipereka chitsanzo cha makonzedwe a backend host, omwe, kwenikweni, ali ndi udindo wosinthira. Imayendetsedwa ndi seva yakutsogolo, komanso ndi Nginx, pomwe caching imachitika kwa nthawi (masiku) ndi zinthu zina.

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

Zomwe zimafunikira (kukulitsa chithunzi kuzungulira m'mphepete) zimachitika pogwiritsa ntchito img:extent() ndipo imatanthauzidwa pogwiritsa ntchito parameter resize ndi chizindikiro + kumapeto.

Njira zotsatirazi zilipo:

  • WxH (Sungani mawonekedwe, gwiritsani ntchito mawonekedwe apamwamba)
  • WxH^ (Sungani mawonekedwe, gwiritsani ntchito gawo lotsika (mbewu)
  • WxH! (Penyani kuchuluka kwa mawonekedwe)
  • WxH+ (Sungani mawonekedwe, onjezani malire)

Chidule cha tebulo ndi zotsatira zosintha kukula kwake

Funsani parameter ya uri
Kukula kwa Chithunzi Chotulutsa

?resize=400Γ—200
200 Γ— 200

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

?kukula = 400Γ—200!
400Γ—200 (Osalingana)

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

Sinthani zithunzi pa ntchentche pogwiritsa ntchito Nginx ndi LuaJIT (OpenResty)

Zotsatira

Poganizira mphamvu ndi kuphweka kwa njirayi, mutha kugwiritsa ntchito zinthu ndi malingaliro ovuta kwambiri, mwachitsanzo, kuwonjezera ma watermark kapena kugwiritsa ntchito chilolezo chokhala ndi mwayi wochepa. Kuti mudziwe kuthekera kwa API yogwira ntchito ndi zithunzi, mutha kulozera ku zolemba za library isage/lua-imagick

Source: www.habr.com

Kuwonjezera ndemanga