Aldatu irudiak hegan Nginx eta LuaJIT erabiliz (OpenResty)

Aspalditik, artikuluan inspiratuta Aldatu irudiak hegan irudiaren tamaina aldatzea erabiliz konfiguratu da ngx_http_image_filter_module eta dena behar bezala funtzionatu zuen. Baina arazo bat sortu zen kudeatzaileak zerbitzu batzuetara igotzeko neurri zehatzak dituzten irudiak jaso behar zituenean, zeren... hauek ziren haien eskakizun teknikoak. Adibidez, tamainako irudi original bat badugu 1200 Γ— 1200, eta tamaina aldatzean antzeko zerbait idazten dugu ?tamaina aldatu=600Γ—400, orduan proportzionalki murriztutako irudi bat lortuko dugu ertz txikienean, tamainan 400 Γ— 400. Era berean, ezinezkoa da bereizmen handiagoko irudi bat lortzea (upscale). Horiek. ?tamaina aldatu=1500Γ—1500 irudi bera itzuliko du 1200 Γ— 1200

Artikulu hau erreskatatu zen OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea Nginx-ek Lua-rekin eta liburutegia bera Lua-rekin nola lan egiten duen ulertzeko isage/lua-imagick - Lua pure-c loturak ImageMagick-i. Zergatik aukeratu zen irtenbide hau, eta ez, esate baterako, python-en zerbait - azkarra eta erosoa delako. Ez duzu fitxategirik sortu beharrik, dena ondo dago Nginx konfigurazioan (aukerakoa).

Beraz, zer behar dugu

Adibideak Debian oinarrituta emango dira.

Nginx eta nginx-extras instalatzen

apt-get update
apt-get install nginx-extras

LuaJIT instalatzen

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

Imagemagick instalatzen

apt-get -y install imagemagick

eta liburutegiak makila magikoa horri, nire kasuan 6. bertsiorako

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

Lua-imagick eraikitzea

Biltegia klonatzen dugu (edo zip-a hartu eta deskonprimitu)

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

Dena ondo joan bada, Nginx konfigura dezakezu.

Backend ostalariaren konfigurazioaren adibide bat emango dut, hain zuzen ere, tamaina aldatzeaz arduratzen dena. Aurrealdeko zerbitzariak proxy egiten du, baita Nginx-ekin ere, non caching denbora-tarte jakin batean (egunetan) eta beste gauza batzuetan gertatzen den.

nginx backend konfigurazioa

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

Behar zena (irudia ertzetan zabaltzea) erabiliz gertatzen da img:extent() eta parametroa erabiliz definitzen da resize seinale batekin + amaieran.

Aukera hauek daude eskuragarri:

  • WxH (Mantendu aspektu-erlazioa, erabili dimentsio handiagoa)
  • WxH^ (Mantendu aspektu-erlazioa, erabili beheko dimentsioa (moztu))
  • WxH! (Ez ikusi aspektu-erlazioa)
  • WxH+ (Mantendu aspektu-erlazioa, gehitu alboko ertzak)

Taula laburpena tamaina aldatzeko emaitzekin

Eskatu uri parametroa
Irteerako irudiaren tamaina

?tamaina aldatu=400Γ—200
200 Γ— 200

?tamaina aldatu=400Γ—200^
400 Γ— 400

?tamaina aldatu=400Γ—200!
400Γ—200 (ez proportzionala)

?tamaina aldatu=400Γ—200+
400Γ—200 (proportzionala)

Aldatu irudiak hegan Nginx eta LuaJIT erabiliz (OpenResty)

Guztira

Ikuspegi honen boterea eta sinpletasuna kontuan hartuta, logika nahiko konplexuarekin gauzatu ditzakezu, adibidez, ur-markak gehitzea edo sarbide mugatuko baimena ezartzea. Irudiekin lan egiteko APIak dituen gaitasunak ezagutzeko, liburutegiko dokumentazioa jo dezakezu isage/lua-imagick

Iturria: www.habr.com

Gehitu iruzkin berria