Ṣe atunṣe awọn aworan lori fifo ni lilo Nginx ati LuaJIT (OpenResty)

Fun igba diẹ bayi, atilẹyin nipasẹ nkan naa Aworan iwọn lori awọn fly Atunto iwọn aworan ni lilo ngx_http_image_filter_module ati ohun gbogbo ṣiṣẹ bi o ti yẹ. Ṣugbọn iṣoro kan dide nigbati oluṣakoso nilo lati gba awọn aworan pẹlu awọn iwọn gangan fun gbigbe si awọn iṣẹ kan, nitori… awọn wọnyi ni awọn ibeere imọ-ẹrọ wọn. Fun apẹẹrẹ, ti a ba ni aworan atilẹba ti iwọn 1200 × 1200, ati nigba ti o ba ṣe atunṣe a kọ nkan bi ?iwọn = 600×400, lẹhinna a gba aworan ti o dinku ni ibamu pẹlu eti ti o kere julọ, iwọn 400 × 400. Ko ṣee ṣe lati gba aworan pẹlu ipinnu ti o ga julọ (oke). Awon. ?iwọn = 1500×1500 yoo da aworan kanna pada 1200 × 1200

Nkan yii wa si igbala OpenResty: titan NGINX sinu olupin ohun elo ti o ni kikun lati ni oye bi Nginx ṣe n ṣiṣẹ pẹlu Lua ati ile-ikawe funrararẹ fun Lua isage / lua-imagick - Lua pure-c abuda to ImageMagick. Kini idi ti a yan ojutu yii, kii ṣe, sọ, nkankan ni Python - nitori pe o yara ati irọrun. Iwọ ko paapaa nilo lati ṣẹda awọn faili eyikeyi, ohun gbogbo tọ ni atunto Nginx (aṣayan).

Nitorina kini a nilo

Awọn apẹẹrẹ yoo fun ni da lori Debian.

Fifi nginx ati awọn afikun nginx

apt-get update
apt-get install nginx-extras

Fifi LuaJIT sori ẹrọ

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

Fifi imagemagick

apt-get -y install imagemagick

ati awọn ile-ikawe magickwand si o, ninu ọran mi fun ẹya 6

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

Ilé lua-imagick

A ṣe ẹda ibi ipamọ naa (tabi mu zip naa ki o tu silẹ)

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

Ti ohun gbogbo ba lọ daradara, o le tunto Nginx.

Emi yoo fun apẹẹrẹ ti atunto ti agbalejo ẹhin, eyiti, ni otitọ, jẹ iduro fun iwọntunwọnsi. O jẹ aṣoju nipasẹ olupin iwaju, tun pẹlu Nginx, nibiti caching waye fun akoko kan (awọn ọjọ) ati awọn nkan miiran.

nginx backend konfigi

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

Ohun ti a beere (fifẹ aworan ni ayika awọn egbegbe) ṣẹlẹ ni lilo img:extent() ati ti wa ni asọye nipa lilo paramita resize pẹlu ami kan + ni ipari.

Awọn aṣayan wọnyi wa:

  • WxH (Jeki ipin-ipin, lo iwọn ti o ga julọ)
  • WxH^ (Jeki ipin-ipin, lo iwọn kekere (irugbin))
  • WxH! (Foju abala-ipin)
  • WxH+ (Jeki ipin-ipin, ṣafikun awọn aala ẹgbẹ)

Tabili Lakotan pẹlu awọn abajade iwọn

Beere uri paramita
Iwon Aworan Ijade

?iwọn = 400×200
200 × 200

?iwọn = 400×200^
400 × 400

?iwọn = 400×200!
400×200 (kii ṣe deede)

?iwọn = 400×200+
400×200 (Iwọn)

Ṣe atunṣe awọn aworan lori fifo ni lilo Nginx ati LuaJIT (OpenResty)

Abajade

Ṣiyesi agbara ati ayedero ti ọna yii, o le ṣe awọn nkan pẹlu ọgbọn idiju, fun apẹẹrẹ, fifi awọn ami omi kun tabi imuse aṣẹ pẹlu iwọle to lopin. Lati le wa awọn agbara ti API fun ṣiṣẹ pẹlu awọn aworan, o le tọka si iwe-ikawe isage / lua-imagick

orisun: www.habr.com

Fi ọrọìwòye kun