Resize mifananidzo panhunzi uchishandisa Nginx uye LuaJIT (OpenResty)

Kwenguva yakati rebei ikozvino, yakafuridzirwa nechinyorwa Mufananidzo uri kukura panhunzi saizi yemufananidzo yakagadziriswa uchishandisa ngx_http_image_filter_module uye zvinhu zvose zvakashanda sezvazvaifanira. Asi rimwe dambudziko rakamuka apo maneja aida kugashira mifananidzo ine chiyero chaidzo chekuisa kune mamwe masevhisi, nekuti... izvi ndizvo zvavaida zvehunyanzvi. Semuenzaniso, kana tine mufananidzo wepakutanga wehukuru 1200 Γ— 1200, uye kana tichiisa saizi tinonyora chimwe chinhu chakadai ?resize=600Γ—400, tobva tawana mufananidzo wakadzikiswa zvakaenzanirana pamucheto mudiki, saizi 400 Γ— 400. Izvo zvakare hazvigoneke kuwana chifananidzo chine chigadziriso chepamusoro (upscale). Avo. ?resize=1500Γ—1500 ichadzorera mufananidzo mumwe chete 1200 Γ— 1200

Nyaya iyi yakabatsira OpenResty: kushandura NGINX kuita yakazara-yakazara application server kuti unzwisise kuti Nginx inoshanda sei neLua uye raibhurari pachayo yeLua isage/lua-imagick - Lua pure-c inosunga kuImageMagick. Sei mhinduro iyi yakasarudzwa, uye kwete, taura, chimwe chinhu mupython - nokuti inokurumidza uye iri nyore. Iwe hautombodi kugadzira chero mafaera, zvese zvakanaka muNginx config (sarudzo).

Saka chii chatinoda

Mienzaniso ichapihwa zvichibva paDebian.

Kuisa nginx uye nginx-zvekuwedzera

apt-get update
apt-get install nginx-extras

Kuisa LuaJIT

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

Kuisa imagemagick

apt-get -y install imagemagick

nemaraibhurari magickwand kwairi, mune yangu shanduro 6

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

Kuvaka lua-imagick

Isu tinogadzirisa repository (kana kutora zip uye kuisunungura)

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

Kana zvese zvikafamba zvakanaka, unogona kugadzirisa Nginx.

Ini ndichapa muenzaniso weiyo config ye backend host, iyo, chokwadi, ine basa rekukura. Iyo inofambiswa neyekumberi sevha, zvakare neNginx, uko caching inoitika kweimwe nguva yenguva (mazuva) nezvimwe zvinhu.

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

Izvo zvaidiwa (kuwedzera mufananidzo wakatenderedza mipendero) zvinoitika uchishandisa img:extent() uye inotsanangurwa uchishandisa parameter resize nechiratidzo + pakupedzisira.

Izvi zvinotevera zvingasarudzwa zviripo:

  • WxH (Chengetedza chimiro-chiyero, shandisa chiyero chepamusoro)
  • WxH^ (Chengeta chimiro-reshiyo, shandisa yakaderera dimension (chirimwa))
  • WxH! (Rega chikamu-chiyero)
  • WxH+ (Chengetedza chimiro-reshiyo, wedzera miganhu)

Pfupiso tafura ine resize zvawanikwa

Kumbira uri parameter
Output Image Size

?resize=400Γ—200
200 Γ— 200

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

?resize=400Γ—200!
400Γ—200 (Haisi kuenzana)

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

Resize mifananidzo panhunzi uchishandisa Nginx uye LuaJIT (OpenResty)

Mugumisiro

Tichifunga nezvesimba uye kureruka kweiyi nzira, unogona kuita zvinhu zvine musoro wakaoma, semuenzaniso, kuwedzera watermark kana kuita mvumo nekuwana kushoma. Kuti uwane kugona kweiyo API yekushanda nemifananidzo, unogona kutarisa kune raibhurari zvinyorwa isage/lua-imagick

Source: www.habr.com

Voeg