Nginx ۽ LuaJIT (OpenResty) استعمال ڪندي اڏام تي تصويرن جو سائز تبديل ڪريو

ڪافي وقت تائين، آرٽيڪل پاران متاثر ٿيو اڏام تي تصويرن جو سائز تبديل ڪريو تصوير جي ماپ کي استعمال ڪندي ترتيب ڏني وئي ngx_http_image_filter_module ۽ هر شي ڪم ڪيو جيئن اهو گهرجي. پر هڪ مسئلو پيدا ٿيو جڏهن مئنيجر کي ڪجهه خدمتن تي اپلوڊ ڪرڻ لاءِ صحيح طول و عرض سان تصويرون حاصل ڪرڻ گهرجن، ڇاڪاڻ ته ... اهي سندن فني گهرجون هئا. مثال طور، جيڪڏهن اسان وٽ سائيز جي اصل تصوير آهي 1200 × 1200، ۽ جڏهن ريسائيز ڪريون ٿا ته اسان ڪجهه لکندا آهيون جيئن resize=600×400، پوءِ اسان هڪ متناسب طور تي گھٽ واري تصوير حاصل ڪندا آهيون ننڍي کنڊ، سائيز سان 400 × 400. اهو پڻ ناممڪن آهي ته هڪ اعلي ريزوليوشن سان تصوير حاصل ڪرڻ (اپ اسڪيل). اهي. resize=1500×1500 ساڳي تصوير واپس ڪندو 1200 × 1200

هي مضمون بچاء لاء آيو OpenResty: NGINX کي مڪمل ايپليڪيشن سرور ۾ تبديل ڪرڻ سمجھڻ لاءِ ته نينگڪس لوا سان ڪيئن ڪم ڪري ٿو ۽ لائبريري پاڻ لوا لاءِ isage/lua-imagick - Lua pure-c bindings to 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

انسٽاليشن تصوير جي جادوگر

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 پس منظر 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
    }
}

ڇا گهربل هو (ڪنارن جي چوڌاري تصوير کي وڌائڻ) استعمال ڪندي ٿئي ٿي 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

تبصرو شامل ڪريو