Redimansyonman imaj yo sou vole lè l sèvi avèk Nginx ak LuaJIT (OpenResty)

Depi kèk tan kounye a, enspire pa atik la Redimensionner imaj sou vole rdimansyon imaj yo te configuré lè l sèvi avèk ngx_http_image_filter_module ak tout bagay te travay jan li ta dwe. Men, yon pwoblèm te parèt lè manadjè a te bezwen resevwa imaj ak dimansyon egzak pou telechaje nan kèk sèvis, paske... sa yo te kondisyon teknik yo. Pou egzanp, si nou gen yon imaj orijinal nan gwosè 1200 × 1200, epi lè redimensionnement nou ekri yon bagay tankou ?resize=600×400, Lè sa a, nou jwenn yon imaj pwopòsyonèl redwi ansanm kwen ki pi piti a, gwosè 400 × 400. Li enposib tou pou jwenn yon imaj ak yon rezolisyon ki pi wo (en). Moun sa yo. ?resize=1500×1500 pral retounen menm imaj la 1200 × 1200

Atik sa a te vin sekou OpenResty: vire NGINX nan yon sèvè aplikasyon konplè pou w konprann kijan Nginx travay ak Lua ak bibliyotèk li menm pou Lua isage/lua-imagick - Liaisons pure-c pou ImageMagick. Poukisa yo te chwazi solisyon sa a, epi yo pa, di, yon bagay nan python - paske li se vit ak pratik. Ou pa menm bezwen kreye nenpòt ki dosye, tout bagay dwat nan konfigirasyon Nginx (si ou vle).

Se konsa, sa nou bezwen

Egzanp yo pral bay ki baze sou Debian.

Enstale nginx ak nginx-extras

apt-get update
apt-get install nginx-extras

Enstale LuaJIT

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

Enstale imagemagick

apt-get -y install imagemagick

ak bibliyotèk majik pou li, nan ka mwen an pou vèsyon 6

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

Bati lua-imagick

Nou klonaj depo a (oswa pran postal la epi depake li)

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

Si tout bagay ale byen, ou ka configured Nginx.

Mwen pral bay yon egzanp nan konfigirasyon an nan lame a backend, ki, an reyalite, se responsab pou redimansyonman. Li se proxy pa sèvè devan an, tou ak Nginx, kote kachèt rive pou yon sèten peryòd tan (jou) ak lòt bagay.

nginx backend konfigirasyon

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

Ki sa ki te mande (agrandi imaj la alantou bor yo) k ap pase lè l sèvi avèk img:extent() epi li defini lè l sèvi avèk paramèt la resize ak yon siy + nan fen an.

Opsyon sa yo disponib:

  • WxH (Kenbe rapò aspè, sèvi ak pi wo dimansyon)
  • WxH^ (Kenbe rapò aspè yo, sèvi ak pi ba dimansyon (rekòt))
  • WxH! (Ignore rapò aspè)
  • WxH + (Kenbe rapò aspè yo, ajoute fwontyè bò)

Tablo rezime ak rezilta redimansyon

Mande paramèt uri
Gwosè Imaj Sòti

?resize=400×200
200 × 200

?resize=400×200^
400 × 400

?resize=400×200!
400 × 200 (Pa pwopòsyonèl)

?resize=400×200+
400×200 (pwopòsyonèl)

Redimansyonman imaj yo sou vole lè l sèvi avèk Nginx ak LuaJIT (OpenResty)

Total

Lè ou konsidere pouvwa ak senplisite apwòch sa a, ou ka aplike bagay sa yo ak yon lojik byen konplèks, pou egzanp, ajoute filigran oswa aplike otorizasyon ak aksè limite. Pou chèche konnen kapasite API a pou travay ak imaj, ou ka refere a dokiman bibliyotèk la isage/lua-imagick

Sous: www.habr.com

Add nouvo kòmantè