Nginx ಮತ್ತು LuaJIT (OpenResty) ಬಳಸಿಕೊಂಡು ಹಾರಾಡುತ್ತ ಚಿತ್ರಗಳನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸಿ

ಈಗ ಸ್ವಲ್ಪ ಸಮಯದವರೆಗೆ, ಲೇಖನದಿಂದ ಸ್ಫೂರ್ತಿ ಹಾರಾಡುತ್ತ ಚಿತ್ರಗಳನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸಿ ಚಿತ್ರದ ಗಾತ್ರವನ್ನು ಬಳಸಿಕೊಂಡು ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ ngx_http_image_filter_module ಮತ್ತು ಎಲ್ಲವೂ ಬೇಕಾದಂತೆ ಕೆಲಸ ಮಾಡಿದೆ. ಆದರೆ ಕೆಲವು ಸೇವೆಗಳಿಗೆ ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ನಿರ್ವಾಹಕರು ನಿಖರವಾದ ಆಯಾಮಗಳೊಂದಿಗೆ ಚಿತ್ರಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಅಗತ್ಯವಿರುವಾಗ ಒಂದು ಸಮಸ್ಯೆ ಉದ್ಭವಿಸಿದೆ, ಏಕೆಂದರೆ... ಇವು ಅವರ ತಾಂತ್ರಿಕ ಅವಶ್ಯಕತೆಗಳಾಗಿದ್ದವು. ಉದಾಹರಣೆಗೆ, ನಾವು ಗಾತ್ರದ ಮೂಲ ಚಿತ್ರವನ್ನು ಹೊಂದಿದ್ದರೆ 1200 × 1200, ಮತ್ತು ಮರುಗಾತ್ರಗೊಳಿಸುವಾಗ ನಾವು ಏನನ್ನಾದರೂ ಬರೆಯುತ್ತೇವೆ ? ಗಾತ್ರ=600×400, ನಂತರ ನಾವು ಚಿಕ್ಕ ಅಂಚು, ಗಾತ್ರದ ಉದ್ದಕ್ಕೂ ಪ್ರಮಾಣಾನುಗುಣವಾಗಿ ಕಡಿಮೆಯಾದ ಚಿತ್ರವನ್ನು ಪಡೆಯುತ್ತೇವೆ 400 × 400. ಹೆಚ್ಚಿನ ರೆಸಲ್ಯೂಶನ್ (ಅಪ್‌ಸ್ಕೇಲ್) ಹೊಂದಿರುವ ಚಿತ್ರವನ್ನು ಪಡೆಯುವುದು ಸಹ ಅಸಾಧ್ಯ. ಆ. ? ಗಾತ್ರ=1500×1500 ಅದೇ ಚಿತ್ರವನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ 1200 × 1200

ಈ ಲೇಖನವು ರಕ್ಷಣೆಗೆ ಬಂದಿತು OpenResty: NGINX ಅನ್ನು ಪೂರ್ಣ ಪ್ರಮಾಣದ ಅಪ್ಲಿಕೇಶನ್ ಸರ್ವರ್ ಆಗಿ ಪರಿವರ್ತಿಸಲಾಗುತ್ತಿದೆ ಲುವಾ ಮತ್ತು ಲೈಬ್ರರಿಯೊಂದಿಗೆ ಲುವಾ ಜೊತೆ Nginx ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು isage/lua-imagick - ಇಮೇಜ್‌ಮ್ಯಾಜಿಕ್‌ಗೆ ಲುವಾ ಪ್ಯೂರ್-ಸಿ ಬೈಂಡಿಂಗ್‌ಗಳು. ಈ ಪರಿಹಾರವನ್ನು ಏಕೆ ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ, ಮತ್ತು ಪೈಥಾನ್‌ನಲ್ಲಿ ಏನನ್ನಾದರೂ ಹೇಳುವುದಿಲ್ಲ - ಏಕೆಂದರೆ ಇದು ವೇಗ ಮತ್ತು ಅನುಕೂಲಕರವಾಗಿದೆ. ನೀವು ಯಾವುದೇ ಫೈಲ್‌ಗಳನ್ನು ರಚಿಸುವ ಅಗತ್ಯವಿಲ್ಲ, ಎಲ್ಲವೂ Nginx ಸಂರಚನೆಯಲ್ಲಿ ಸರಿಯಾಗಿದೆ (ಐಚ್ಛಿಕ).

ಹಾಗಾದರೆ ನಮಗೆ ಏನು ಬೇಕು

ಡೆಬಿಯನ್ ಆಧಾರದ ಮೇಲೆ ಉದಾಹರಣೆಗಳನ್ನು ನೀಡಲಾಗುವುದು.

nginx ಮತ್ತು nginx-ಹೆಚ್ಚುವರಿಗಳನ್ನು ಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ

apt-get update
apt-get install nginx-extras

LuaJIT ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ

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

ಇಮೇಜ್‌ಮ್ಯಾಜಿಕ್ ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ

apt-get -y install imagemagick

ಮತ್ತು ಗ್ರಂಥಾಲಯಗಳು ಮ್ಯಾಜಿಕ್ವಾಂಡ್ ಅದಕ್ಕೆ, ನನ್ನ ಸಂದರ್ಭದಲ್ಲಿ ಆವೃತ್ತಿ 6

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

ಲುವಾ-ಇಮ್ಯಾಜಿಕ್ ಅನ್ನು ನಿರ್ಮಿಸುವುದು

ನಾವು ರೆಪೊಸಿಟರಿಯನ್ನು ಕ್ಲೋನ್ ಮಾಡುತ್ತೇವೆ (ಅಥವಾ ಜಿಪ್ ತೆಗೆದುಕೊಂಡು ಅದನ್ನು ಅನ್ಪ್ಯಾಕ್ ಮಾಡಿ)

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+ (ಆಕಾರ-ಅನುಪಾತವನ್ನು ಇರಿಸಿ, ಅಡ್ಡ ಅಂಚುಗಳನ್ನು ಸೇರಿಸಿ)

ಮರುಗಾತ್ರ ಫಲಿತಾಂಶಗಳೊಂದಿಗೆ ಸಾರಾಂಶ ಕೋಷ್ಟಕ

ಯುರಿ ಪ್ಯಾರಾಮೀಟರ್ ಅನ್ನು ವಿನಂತಿಸಿ
ಔಟ್ಪುಟ್ ಚಿತ್ರದ ಗಾತ್ರ

? ಗಾತ್ರ=400×200
200 × 200

?resize=400×200^
400 × 400

?ಮರುಗಾತ್ರ=400×200!
400×200 (ಪ್ರಮಾಣದಲ್ಲ)

? ಮರುಗಾತ್ರಗೊಳಿಸಿ=400×200+
400×200 (ಅನುಪಾತ)

Nginx ಮತ್ತು LuaJIT (OpenResty) ಬಳಸಿಕೊಂಡು ಹಾರಾಡುತ್ತ ಚಿತ್ರಗಳನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸಿ

ಫಲಿತಾಂಶ

ಈ ವಿಧಾನದ ಶಕ್ತಿ ಮತ್ತು ಸರಳತೆಯನ್ನು ಪರಿಗಣಿಸಿ, ನೀವು ಸಾಕಷ್ಟು ಸಂಕೀರ್ಣವಾದ ತರ್ಕದೊಂದಿಗೆ ವಿಷಯಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಬಹುದು, ಉದಾಹರಣೆಗೆ, ನೀರುಗುರುತುಗಳನ್ನು ಸೇರಿಸುವುದು ಅಥವಾ ಸೀಮಿತ ಪ್ರವೇಶದೊಂದಿಗೆ ಅಧಿಕಾರವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದು. ಚಿತ್ರಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು API ಯ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ಕಂಡುಹಿಡಿಯಲು, ನೀವು ಲೈಬ್ರರಿ ದಸ್ತಾವೇಜನ್ನು ಉಲ್ಲೇಖಿಸಬಹುದು isage/lua-imagick

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ