Ngarobih ukuran gambar nganggo Nginx sareng LuaJIT (OpenResty)

Pikeun sababaraha waktos ayeuna, diideuan ku artikel Ngarobah ukuran gambar dina laleur ukuran gambar dikonpigurasi ngagunakeun ngx_http_image_filter_module jeung sagalana digawé sakumaha sakuduna. Tapi hiji masalah timbul nalika manajer diperlukeun pikeun nampa gambar kalawan diménsi pasti pikeun unggah ka sababaraha layanan, sabab ... ieu sarat téknis maranéhanana. Contona, lamun urang boga hiji gambar aslina ukuranana 1200 × 1200, sarta nalika ngarobah ukuran urang nulis hal kawas ?ukuran=600×400, Teras we meunang gambar ngurangan proporsional sapanjang ujung pangleutikna, ukuran 400 × 400. Ogé teu mungkin pikeun ménta hiji gambar kalawan resolusi luhur (upscale). Jelema. ?ukuran=1500×1500 bakal balik gambar sarua 1200 × 1200

Artikel ieu sumping ka nyalametkeun teh OpenResty: ngarobah NGINX kana server aplikasi pinuh ngartos kumaha Nginx jalan kalawan Lua jeung perpustakaan sorangan pikeun Lua isage / lua-imagick - Lua pure-c bindings mun ImageMagick. Naha solusi ieu dipilih, sareng henteu, sebutkeun, anu aya dina python - sabab gancang sareng gampang. Anjeun malah henteu kedah nyiptakeun file naon waé, sadayana leres dina konfigurasi Nginx (opsional).

Janten naon anu urang peryogikeun

Conto bakal dipasihkeun dumasar kana Debian.

Masang nginx sareng nginx-extras

apt-get update
apt-get install nginx-extras

Masang LuaJIT

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

Masang imagemagic

apt-get -y install imagemagick

jeung perpustakaan sulap ka dinya, bisi kuring pikeun versi 6

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

Wangunan lua-imagick

Urang clone gudang (atanapi nyandak zip sareng ngabongkar éta)

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

Upami sadayana lancar, anjeun tiasa ngonpigurasikeun Nginx.

Kuring bakal masihan conto config tina host backend, nu, kanyataanna, tanggung jawab pangaturan ukuran jadi. Éta diproksi ku server hareup, ogé sareng Nginx, dimana cache lumangsung pikeun sababaraha waktos (dinten) sareng hal-hal sanés.

nginx backend config

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

Naon anu diperlukeun (ngalegaan gambar sabudeureun edges) kajadian ngagunakeun img:extent() sarta dihartikeun ngagunakeun parameter resize kalawan tanda + di tungtung.

Pilihan di handap ieu sayogi:

  • WxH (Simpen rasio aspék, paké diménsi anu langkung luhur)
  • WxH^ (Tetep rasio aspék, nganggo diménsi handap (potongan))
  • WxH! (Abaikan rasio aspék)
  • WxH+ (Tetep rasio aspék, tambahkeun wates sisi)

Tabel kasimpulan sareng hasil ukuran

Ménta parameter uri
Ukuran Gambar Kaluaran

?ukuran=400×200
200 × 200

?ukuran=400×200^
400 × 400

?ukuran=400×200!
400×200 (Teu sabanding)

?ukuran=400×200+
400×200 (Proporsional)

Ngarobih ukuran gambar nganggo Nginx sareng LuaJIT (OpenResty)

hasil

Nganggap kakuatan sareng kesederhanaan pendekatan ieu, anjeun tiasa ngalaksanakeun hal-hal kalayan logika anu rada rumit, contona, nambihan watermark atanapi ngalaksanakeun otorisasi kalayan aksés terbatas. Pikeun milarian kamampuan API pikeun damel sareng gambar, anjeun tiasa ningali kana dokuméntasi perpustakaan isage / lua-imagick

sumber: www.habr.com

Tambahkeun komentar