Mezinahiya wêneyan bi karanîna Nginx û LuaJIT (OpenResty) di firînê de biguherînin

Ji demek dirêj ve, ji gotarê hatî îlhama kirin Mezinahiya wêneyên li ser firînê biguherînin mezinbûna wêneyê bi kar hat mîheng kirin ngx_http_image_filter_module û her tişt wekî ku divê xebitî. Lê pirsgirêkek derket dema ku rêveber hewce bû ku ji bo barkirina hin karûbaran wêneyên bi pîvanên tam werbigire, ji ber ku ... ev pêdiviyên wan ên teknîkî bûn. Mînakî, heke me wêneyek orjînal a mezinbûnê hebe 1200 × 1200, û dema mezinbûnê em tiştekî wisa dinivîsin Mezinahî=600×400, wê hingê em wêneyek bi rêkûpêk kêmkirî li kêleka herî piçûk, mezinahî distînin 400 × 400. Di heman demê de ne gengaz e ku wêneyek bi rezîliya bilind (bilindtir) were bidestxistin. Ewan. Mezinahî=1500×1500 dê heman wêneyê vegerîne 1200 × 1200

Ev gotar ji bo rizgariyê hat OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî fêm bikin ka Nginx çawa bi Lua û pirtûkxane bi xwe re ji bo Lua re dixebite isage/lua-imagick - Lua pure-c bi ImageMagick ve girêdayî ye. Çima ev çareserî hate hilbijartin, û ne, bêje, tiştek di python de - ji ber ku ew zû û hêsan e. Tewra ne hewce ye ku hûn pelan biafirînin, her tişt di veavakirina Nginx de rast e (vebijarkî).

Ji ber vê yekê em çi hewce ne

Nimûne dê li ser bingeha Debian bêne dayîn.

Sazkirina nginx û nginx-extras

apt-get update
apt-get install nginx-extras

Sazkirina LuaJIT

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

Sazkirina imagemagick

apt-get -y install imagemagick

û pirtûkxane magickwand ji bo wê, di doza min de ji bo guhertoya 6

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

Avakirina lua-imagick

Em depoyê klon dikin (an zip digirin û jê pak dikin)

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

Ger her tişt baş bû, hûn dikarin Nginx mîheng bikin.

Ez ê mînakek veavakirina mêvandarê paşverû, ku, bi rastî, ji nûvekirina mezinbûnê berpirsiyar e, bidim. Ew ji hêla servera pêşîn ve, di heman demê de bi Nginx re, ku caching ji bo demek diyarkirî (rojan) û tiştên din pêk tê, tê proksî kirin.

veavakirina pişta nginx

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

Ya ku hewce bû (berfirehkirina wêneyê li dora kevanan) bi kar tîne img:extent() û bi karanîna pîvanê tête diyar kirin resize bi nîşanek + di dawiyê de.

Vebijêrkên jêrîn hene:

  • WxH (rêjeya aspektê bihêle, pîvana bilindtir bikar bîne)
  • WxH^ (Aspect-rêjeya xwe bigire, pîvana jêrîn bikar bîne (birr))
  • WxH! (Aspect-rêjeya paşguh neke)
  • WxH+ (Aspect-rêjeya xwe bigire, sînorên alî lê zêde bike)

Tabloya kurteya bi encamên mezinbûnê

Parametreya uri daxwaz bikin
Mezinahiya Wêne Derketî

Mezinahî=400×200
200 × 200

?resize=400×200^
400 × 400

?resize=400×200!
400×200 (Ne rêjeyî)

?mezinahî=400×200+
400×200 (Nasib)

Mezinahiya wêneyan bi karanîna Nginx û LuaJIT (OpenResty) di firînê de biguherînin

Encam

Bi berçavgirtina hêz û sadebûna vê nêzîkatiyê, hûn dikarin tiştan bi mantiqek pir tevlihev bicîh bikin, mînakî, pêvekirina avê nîşanan an bicîhkirina destûrnameyê bi gihîştina tixûbdar. Ji bo ku hûn kapasîteyên API-yê yên ji bo xebata bi wêneyan fêr bibin, hûn dikarin serî li belgeya pirtûkxaneyê bidin. isage/lua-imagick

Source: www.habr.com

Add a comment