Maimaita hotuna akan tashi ta amfani da Nginx da LuaJIT (OpenResty)

Don ɗan lokaci kaɗan yanzu, wahayi zuwa labarin Girman hoto akan tashi an daidaita girman hoton ta amfani da ngx_http_image_filter_module kuma komai yayi aiki yadda yakamata. Amma matsala ɗaya ta taso lokacin da manajan ya buƙaci karɓar hotuna masu ma'ana daidai don loda zuwa wasu ayyuka, saboda ... Waɗannan su ne bukatun fasaha. Misali, idan muna da hoton asali na girman 1200 × 1200, kuma lokacin da muka canza girman muna rubuta wani abu kamar ?girma = 600×400, to, muna samun siffar da aka rage daidai gwargwado tare da mafi ƙanƙanci, girman 400 × 400. Hakanan ba shi yiwuwa a sami hoto tare da ƙuduri mafi girma (mafi girma). Wadancan. ?girma = 1500×1500 zai dawo da wannan hoton 1200 × 1200

Wannan labarin ya zo don ceto OpenResty: juya NGINX zuwa uwar garken aikace-aikace cikakke don fahimtar yadda Nginx ke aiki tare da Lua da ɗakin karatu kanta na Lua isage/lua-imagick - Lua pure-c ɗaurin zuwa ImageMagick. Me yasa aka zaɓi wannan bayani, kuma ba, a ce, wani abu a cikin Python - saboda yana da sauri da dacewa. Ba kwa buƙatar ƙirƙirar kowane fayiloli, komai daidai a cikin tsarin Nginx (na zaɓi).

To me muke bukata

Za a bayar da misalai bisa Debian.

Shigar da nginx da nginx-extras

apt-get update
apt-get install nginx-extras

Ana shigar da LuaJIT

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

Sanya imagemagick

apt-get -y install imagemagick

da dakunan karatu sihiri da shi, a cikin akwati na don version 6

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

Gina lua-imagick

Muna rufe ma'ajiyar (ko ɗaukar zip ɗin mu cire shi)

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

Idan komai yayi kyau, zaku iya saita Nginx.

Zan ba da misali na saitin mai watsa shiri na baya, wanda, a zahiri, ke da alhakin sakewa. Sabar ta gaba tana da alaƙa, kuma tare da Nginx, inda caching ke faruwa na wani ɗan lokaci (kwanaki) da sauran abubuwa.

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

Abin da ake buƙata (fadada hoton a gefen gefuna) yana faruwa ta amfani da shi img:extent() kuma an ayyana shi ta amfani da siga resize da alama + a karshen.

Akwai zaɓuɓɓuka masu zuwa:

  • WxH (Ci gaba da juzu'i, yi amfani da girma mafi girma)
  • WxH^ (A ci gaba da juzu'i, yi amfani da ƙananan girma (girma))
  • WxH! (Yi watsi da rabon al'amari)
  • WxH+ (Kiyaye ragi, ƙara iyakokin gefe)

Teburin taƙaitawa tare da girman sakamako

Nemi sigar uri
Girman Hoton Fitar

?girma = 400×200
200 × 200

?girma = 400×200^
400 × 400

?girma = 400×200!
400×200 (Ba daidai ba)

? Girman girma=400×200+
400×200 (daidaitacce)

Maimaita hotuna akan tashi ta amfani da Nginx da LuaJIT (OpenResty)

Sakamakon

Idan aka yi la'akari da ƙarfi da sauƙi na wannan hanyar, zaku iya aiwatar da abubuwa tare da ma'ana mai rikitarwa, misali, ƙara alamar ruwa ko aiwatar da izini tare da iyakanceccen dama. Domin gano iyawar API ɗin don aiki tare da hotuna, kuna iya komawa zuwa takaddun laburare isage/lua-imagick

source: www.habr.com

Add a comment