Nginx және LuaJIT (OpenResty) көмегімен кескіндердің өлшемін жылдам өзгертіңіз

Біраз уақыттан бері мақаладан шабыт алған Кескіндердің өлшемін жылдам өзгертіңіз көмегімен кескін өлшемін өзгерту конфигурацияланды ngx_http_image_filter_module және бәрі қажетінше жұмыс істеді. Бірақ менеджер кейбір қызметтерге жүктеп салу үшін нақты өлшемдері бар кескіндерді алу қажет болғанда бір мәселе туындады, себебі... бұл олардың техникалық талаптары болды. Мысалы, егер бізде өлшемнің түпнұсқалық кескіні болса 1200 × 1200, және өлшемін өзгерту кезінде біз осындай нәрсені жазамыз ?өлшемі=600×400, содан кейін біз ең кішкентай жиек, өлшем бойынша пропорционалды қысқартылған кескінді аламыз 400 × 400. Ажыратымдылығы жоғары (жоғарғы масштаб) кескінді алу да мүмкін емес. Анау. ?өлшемі=1500×1500 сол суретті қайтарады 1200 × 1200

Бұл мақала көмекке келді OpenResty: NGINX толыққанды қолданбалы серверге айналдыру Nginx Луамен қалай жұмыс істейтінін және Луа үшін кітапхананың өзін түсіну үшін isage/lua-imagick - ImageMagick-ке Lua pure-c байланыстары. Неліктен бұл шешім, айталық, питондағы бірдеңе емес, таңдалды - өйткені ол жылдам және ыңғайлы. Сізге тіпті файлдарды жасаудың қажеті жоқ, барлығы Nginx конфигурациясында дұрыс (міндетті емес).

Сонымен бізге не керек

Мысалдар Debian негізінде беріледі.

Nginx және nginx-қосымшаларын орнату

apt-get update
apt-get install nginx-extras

LuaJIT орнатылуда

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

imagemagick орнатылуда

apt-get -y install imagemagick

және кітапханалар сиқырлы таяқша оған, менің жағдайда 6 нұсқасы үшін

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

Lua-imagick құру

Біз репозиторийді клондаймыз (немесе ZIP файлын алып, оны ораудан шығарамыз)

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

Егер бәрі жақсы болса, Nginx конфигурациялауға болады.

Мен серверлік хост конфигурациясының мысалын келтіремін, ол шын мәнінде өлшемін өзгертуге жауап береді. Ол алдыңғы сервермен, сонымен қатар Nginx арқылы проксиденеді, мұнда кэштеу белгілі бір уақыт (күндер) және басқалар үшін орын алады.

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

Қажет болған нәрсе (кескінді жиектерге кеңейту) пайдалану арқылы орындалады img:extent() және параметр арқылы анықталады resize белгісімен + соңында.

Келесі опциялар қолжетімді:

  • WxH (Пікір арақатынасын сақтаңыз, жоғары өлшемді пайдаланыңыз)
  • WxH^ (Пікір арақатынасын сақтаңыз, төменгі өлшемді пайдаланыңыз (қию))
  • WxH! (Пікір арақатынасын елемеу)
  • WxH+ (Пікір арақатынасын сақтаңыз, бүйірлік жиектерді қосыңыз)

Өлшемді өзгерту нәтижелері бар жиынтық кесте

uri параметрін сұрау
Шығарылатын кескін өлшемі

?өлшемі=400×200
200 × 200

?өлшемі=400×200^
400 × 400

?өлшемі=400×200!
400×200 (пропорционал емес)

?өлшемі=400×200+
400×200 (пропорционалды)

Nginx және LuaJIT (OpenResty) көмегімен кескіндердің өлшемін жылдам өзгертіңіз

Нәтиже

Бұл тәсілдің күші мен қарапайымдылығын ескере отырып, сіз өте күрделі логикасы бар нәрселерді жүзеге асыра аласыз, мысалы, су таңбаларын қосу немесе шектеулі рұқсатпен авторизацияны енгізу. Суреттермен жұмыс істеуге арналған API мүмкіндіктерін білу үшін кітапхана құжаттамасына жүгінуге болады isage/lua-imagick

Ақпарат көзі: www.habr.com

пікір қалдыру