ΠŸΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ слика Ρƒ Ρ…ΠΎΠ΄Ρƒ користСћи Нгинк ΠΈ Π›ΡƒΠ°ΠˆΠ˜Π’ (ΠžΠΏΠ΅Π½Π Π΅ΡΡ‚ΠΈ)

Π’Π΅Ρ› Π½Π΅ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅, инспирисан Ρ‡Π»Π°Π½ΠΊΠΎΠΌ ΠŸΡ€ΠΎΠΌΠ΅Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅ сликС Ρƒ Ρ…ΠΎΠ΄Ρƒ ΠŸΡ€ΠΎΠΌΠ΅Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅ сликС јС конфигурисана ΠΏΠΎΠΌΠΎΡ›Ρƒ Π½Π³ΠΊ_Ρ…Ρ‚Ρ‚ΠΏ_ΠΈΠΌΠ°Π³Π΅_Ρ„ΠΈΠ»Ρ‚Π΅Ρ€_ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΠΈ свС јС Ρ€Π°Π΄ΠΈΠ»ΠΎ ΠΊΠ°ΠΊΠΎ Ρ‚Ρ€Π΅Π±Π°. Али јСдан ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ јС настао ΠΊΠ°Π΄Π° јС ΠΌΠ΅Π½Π°ΡŸΠ΅Ρ€ Ρ‚Ρ€Π΅Π±Π°Π»ΠΎ Π΄Π° добијС сликС са Ρ‚Π°Ρ‡Π½ΠΈΠΌ димСнзијама Π·Π° ΠΏΠΎΡΡ‚Π°Π²Ρ™Π°ΡšΠ΅ Π½Π° Π½Π΅ΠΊΠ΅ сСрвисС, Ρ˜Π΅Ρ€... Ρ‚ΠΎ су Π±ΠΈΠ»ΠΈ ΡšΠΈΡ…ΠΎΠ²ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΡ‡ΠΊΠΈ Π·Π°Ρ…Ρ‚Π΅Π²ΠΈ. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°ΠΊΠΎ ΠΈΠΌΠ°ΠΌΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Ρƒ слику Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅ 1200 Γ— 1200, Π° ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅ напишСмо Π½Π΅ΡˆΡ‚ΠΎ ΠΊΠ°ΠΎ ?рСсизС=600Γ—400, ΠΎΠ½Π΄Π° добијамо ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»Π½ΠΎ ΡΠΌΠ°ΡšΠ΅Π½Ρƒ слику Π΄ΡƒΠΆ најмањС ΠΈΠ²ΠΈΡ†Π΅, Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅ 400 Γ— 400. Π’Π°ΠΊΠΎΡ’Π΅ јС Π½Π΅ΠΌΠΎΠ³ΡƒΡ›Π΅ Π΄ΠΎΠ±ΠΈΡ‚ΠΈ слику Π²Π΅Ρ›Π΅ Ρ€Π΅Π·ΠΎΠ»ΡƒΡ†ΠΈΡ˜Π΅ (упсцалС). ОнС. ?рСсизС=1500Γ—1500 Π²Ρ€Π°Ρ‚ΠΈΡ›Π΅ исту слику 1200 Γ— 1200

Овај Ρ‡Π»Π°Π½Π°ΠΊ јС дошао Ρƒ ΠΏΠΎΠΌΠΎΡ› ΠžΠΏΠ΅Π½Π Π΅ΡΡ‚ΠΈ: ΠΏΡ€Π΅Ρ‚Π²Π°Ρ€Π°ΡšΠ΅ ΠΠ“Π˜ΠΠšΠ‘-Π° Ρƒ ΠΏΡƒΠ½ΠΎΠΏΡ€Π°Π²Π½ΠΈ сСрвСр Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π΄Π° Ρ€Π°Π·ΡƒΠΌΠ΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎ Нгинк Ρ€Π°Π΄ΠΈ са Π›ΡƒΠ°-ΠΎΠΌ ΠΈ самом Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΌ Π·Π° Π›ΡƒΠ°-Ρƒ исагС/Π»ΡƒΠ°-ΠΈΠΌΠ°Π³ΠΈΡ†ΠΊ - Π›ΡƒΠ° ΠΏΡƒΡ€Π΅-Ρ† Π²Π΅Π·Π΅ Π·Π° Π˜ΠΌΠ°Π³Π΅ΠœΠ°Π³ΠΈΡ†ΠΊ. Π—Π°ΡˆΡ‚ΠΎ јС ΠΈΠ·Π°Π±Ρ€Π°Π½ΠΎ ΠΎΠ²ΠΎ Ρ€Π΅ΡˆΠ΅ΡšΠ΅, Π° Π½Π΅, Ρ€Π΅Ρ†ΠΈΠΌΠΎ, Π½Π΅ΡˆΡ‚ΠΎ Ρƒ ΠΏΠΈΡ‚ΠΎΠ½Ρƒ – Ρ˜Π΅Ρ€ јС Π±Ρ€Π·ΠΎ ΠΈ Π·Π³ΠΎΠ΄Π½ΠΎ. НС ΠΌΠΎΡ€Π°Ρ‚Π΅ Ρ‡Π°ΠΊ Π½ΠΈ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ΅, свС јС Ρ‚Π°Ρ‡Π½ΠΎ Ρƒ Нгинк ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜ΠΈ (ΠΎΠΏΡ†ΠΈΠΎΠ½ΠΎ).

Па ΡˆΡ‚Π° Π½Π°ΠΌ Ρ‚Ρ€Π΅Π±Π°

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Ρ›Π΅ Π±ΠΈΡ‚ΠΈ Π΄Π°Ρ‚ΠΈ Π½Π° основу Π”Π΅Π±ΠΈΠ°Π½-Π°.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ Π½Π³ΠΈΠ½ΠΊ-Π° ΠΈ Π½Π³ΠΈΠ½ΠΊ-Π΄ΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°

apt-get update
apt-get install nginx-extras

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ Π›ΡƒΠ°ΠˆΠ˜Π’-Π°

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

Ако јС свС ΠΏΡ€ΠΎΡˆΠ»ΠΎ Π΄ΠΎΠ±Ρ€ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡˆΠ΅Ρ‚Π΅ Нгинк.

ΠΠ°Π²Π΅ΡˆΡ›Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π΅ позадинског хоста, који јС, Ρƒ ствари, ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π°Π½ Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Ρƒ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅. ΠŸΡ€ΠΎΠΊΡΠΈΡ˜Π΅ Π³Π° ΠΏΡ€Π΅Π΄ΡšΠΈ сСрвСр, Ρ‚Π°ΠΊΠΎΡ’Π΅ са Нгинк-ΠΎΠΌ, Π³Π΄Π΅ сС ΠΊΠ΅ΡˆΠΈΡ€Π°ΡšΠ΅ дСшава Ρ‚ΠΎΠΊΠΎΠΌ ΠΎΠ΄Ρ€Π΅Ρ’Π΅Π½ΠΎΠ³ врСмСнског ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° (Π΄Π°Π½Π°) ΠΈ Π΄Ρ€ΡƒΠ³Π΅ ствари.

Π½Π³ΠΈΠ½ΠΊ позадинска ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°

# 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 са Π·Π½Π°ΠΊΠΎΠΌ + Π½Π° ΠΊΡ€Π°Ρ˜Ρƒ.

ДоступнС су слСдСћС ΠΎΠΏΡ†ΠΈΡ˜Π΅:

  • Π¨ΠΊΠ’ (Π—Π°Π΄Ρ€ΠΆΠΈ однос ΡˆΠΈΡ€ΠΈΠ½Π΅ ΠΈ висинС, користи Π²Π΅Ρ›Ρƒ Π΄ΠΈΠΌΠ΅Π½Π·ΠΈΡ˜Ρƒ)
  • Π¨ΠΊΠ’^ (Π—Π°Π΄Ρ€ΠΆΠΈ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΡ˜Ρƒ, користи Π½ΠΈΠΆΡƒ Π΄ΠΈΠΌΠ΅Π½Π·ΠΈΡ˜Ρƒ (ΠΈΡΠ΅Ρ†Π°ΡšΠ΅))
  • Π¨ΠΊΠ’! (Π—Π°Π½Π΅ΠΌΠ°Ρ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΡ˜Ρƒ)
  • Π¨ΠΊΠ’+ (Π—Π°Π΄Ρ€ΠΆΠΈ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΡ˜Ρƒ, Π΄ΠΎΠ΄Π°Ρ˜Ρ‚Π΅ Π±ΠΎΡ‡Π½Π΅ ΠΈΠ²ΠΈΡ†Π΅)

Π’Π°Π±Π΅Π»Π° са Ρ€Π΅Π·ΠΈΠΌΠ΅ΠΎΠΌ са Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΠΌΠ° ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅

Π—Π°Ρ…Ρ‚Π΅Π²Π°Ρ˜ ΡƒΡ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Π°Ρ€
Π’Π΅Π»ΠΈΡ‡ΠΈΠ½Π° ΠΈΠ·Π»Π°Π·Π½Π΅ сликС

?рСсизС=400Γ—200
200 Γ— 200

?рСсизС=400Γ—200^
400 Γ— 400

?рСсизС=400Γ—200!
400Γ—200 (нијС ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»Π½ΠΎ)

?рСсизС=400Γ—200+
400Γ—200 (ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»Π½ΠΎ)

ΠŸΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ слика Ρƒ Ρ…ΠΎΠ΄Ρƒ користСћи Нгинк ΠΈ Π›ΡƒΠ°ΠˆΠ˜Π’ (ΠžΠΏΠ΅Π½Π Π΅ΡΡ‚ΠΈ)

Π£ΠΊΡƒΠΏΠ°Π½

Π‘ ΠΎΠ±Π·ΠΈΡ€ΠΎΠΌ Π½Π° снагу ΠΈ Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΎΡΡ‚ ΠΎΠ²ΠΎΠ³ приступа, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ‚ΠΈ ствари са ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ слоТСном Π»ΠΎΠ³ΠΈΠΊΠΎΠΌ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, додавањСм Π²ΠΎΠ΄Π΅Π½ΠΈΡ… ΠΆΠΈΠ³ΠΎΠ²Π° ΠΈΠ»ΠΈ ΡΠΏΡ€ΠΎΠ²ΠΎΡ’Π΅ΡšΠ΅ΠΌ Π°ΡƒΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π΅ са ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΌ приступом. Π”Π° бистС сазнали могућности АПИ-ја Π·Π° Ρ€Π°Π΄ са сликама, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ³Π»Π΅Π΄Π°Ρ‚ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ исагС/Π»ΡƒΠ°-ΠΈΠΌΠ°Π³ΠΈΡ†ΠΊ

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€