Nginx සහ LuaJIT (OpenResty) භාවිතයෙන් පියාසර කරන පින්තූර ප්‍රමාණය වෙනස් කරන්න

දැන් සෑහෙන කාලෙක ඉඳන්, ලිපියෙන් ආභාෂය ලැබුවා පියාසර කරන විට රූපයේ ප්‍රමාණය වෙනස් කිරීම රූපයේ ප්‍රමාණය වෙනස් කිරීම වින්‍යාස කර ඇත ngx_http_image_filter_module සහ සෑම දෙයක්ම කළ යුතු පරිදි ක්‍රියාත්මක විය. නමුත් සමහර සේවාවන් වෙත උඩුගත කිරීම සඳහා කළමනාකරුට නිශ්චිත මානයන් සහිත පින්තූර ලබා ගැනීමට අවශ්‍ය වූ විට එක් ගැටළුවක් මතු විය, මන්ද... මේවා ඔවුන්ගේ තාක්ෂණික අවශ්‍යතා විය. උදාහරණයක් ලෙස, අපට ප්‍රමාණයේ මුල් රූපයක් තිබේ නම් 1200 × 1200, සහ ප්‍රමාණය වෙනස් කිරීමේදී අපි මේ වගේ දෙයක් ලියන්නෙමු ?resize=600×400, එවිට අපි කුඩාම දාරය, ප්රමාණය ඔස්සේ සමානුපාතිකව අඩු කළ රූපයක් ලබා ගනිමු 400 × 400. ඉහළ විභේදනයක් සහිත (ඉහළ මට්ටමේ) රූපයක් ලබා ගැනීමට ද නොහැකි ය. එම. ?resize=1500×1500 එකම රූපය නැවත ලබා දෙනු ඇත 1200 × 1200

මෙම ලිපිය ගලවා ගැනීමට පැමිණියේය OpenResty: NGINX පූර්ණ-පරිපූර්ණ යෙදුම් සේවාදායකයක් බවට පත් කිරීම Nginx Lua සහ Library සමඟ Lua සඳහා ක්‍රියා කරන ආකාරය තේරුම් ගැනීමට isage/lua-imagick - Lua pure-c ImageMagick වෙත බන්ධන. මෙම විසඳුම තෝරාගත්තේ ඇයි, සහ පයිතන් වල යමක් නොකියන්නේ - එය වේගවත් හා පහසු බැවිනි. ඔබට කිසිදු ගොනුවක් සෑදීමට අවශ්‍ය නැත, සියල්ල Nginx වින්‍යාසය තුළ නිවැරදි වේ (විකල්ප).

ඉතින් අපිට මොනවද ඕනේ

ඩේබියන් මත පදනම්ව උදාහරණ ලබා දෙනු ඇත.

nginx සහ nginx-extras ස්ථාපනය කිරීම

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

සහ පුස්තකාල Magkwand එයට, මගේ නඩුවේ 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 පරාමිතිය ඉල්ලන්න
ප්රතිදාන රූප ප්රමාණය

?resize=400×200
200 × 200

?resize=400×200^
400 × 400

?resize=400×200!
400×200 (සමානුපාතික නොවේ)

?resize=400×200+
400×200 (සමානුපාතික)

Nginx සහ LuaJIT (OpenResty) භාවිතයෙන් පියාසර කරන පින්තූර ප්‍රමාණය වෙනස් කරන්න

ප්රතිඵලය

මෙම ප්‍රවේශයේ බලය සහ සරල බව සැලකිල්ලට ගනිමින්, ඔබට තරමක් සංකීර්ණ තර්කනයකින් දේවල් ක්‍රියාත්මක කළ හැකිය, නිදසුනක් ලෙස, ජල සලකුණු එකතු කිරීම හෝ සීමිත ප්‍රවේශයක් සහිත අවසරය ක්‍රියාත්මක කිරීම. පින්තූර සමඟ වැඩ කිරීම සඳහා API හි හැකියාවන් සොයා ගැනීම සඳහා, ඔබට පුස්තකාල ලේඛන වෙත යොමු විය හැකිය. isage/lua-imagick

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න