Nginx اور LuaJIT (OpenResty) کا استعمال کرتے ہوئے پرواز پر تصاویر کا سائز تبدیل کریں

کافی عرصے سے، مضمون سے متاثر ہو کر پرواز پر تصاویر کا سائز تبدیل کریں۔ تصویر کا سائز تبدیل کرنے کا استعمال کرتے ہوئے ترتیب دیا گیا تھا۔ ngx_http_image_filter_module اور سب کچھ کام کیا جیسا کہ اسے کرنا چاہئے. لیکن ایک مسئلہ اس وقت پیدا ہوا جب مینیجر کو کچھ خدمات پر اپ لوڈ کرنے کے لیے درست جہتوں کے ساتھ تصاویر وصول کرنے کی ضرورت تھی، کیونکہ... یہ ان کی تکنیکی ضروریات تھیں۔ مثال کے طور پر، اگر ہمارے پاس سائز کی اصل تصویر ہے۔ 1200 × 1200اور سائز تبدیل کرتے وقت ہم کچھ ایسا لکھتے ہیں۔ resize=600×400، پھر ہمیں سب سے چھوٹے کنارے، سائز کے ساتھ متناسب طور پر کم کی گئی تصویر ملتی ہے۔ 400 × 400. زیادہ ریزولوشن (اعلی درجے) والی تصویر حاصل کرنا بھی ناممکن ہے۔ وہ. resize=1500×1500 اسی تصویر کو واپس کریں گے 1200 × 1200

یہ مضمون بچاؤ کے لیے آیا OpenResty: NGINX کو ایک مکمل ایپلیکیشن سرور میں تبدیل کرنا یہ سمجھنے کے لیے کہ Nginx Lua کے ساتھ کیسے کام کرتا ہے اور خود لائبریری Lua کے لیے isage/lua-imagick - Lua pure-c امیج میجک کے ساتھ پابند ہے۔ یہ حل کیوں چنا گیا، اور نہیں، کہیے، ازگر میں کچھ ہے - کیونکہ یہ تیز اور آسان ہے۔ یہاں تک کہ آپ کو کوئی فائل بنانے کی بھی ضرورت نہیں ہے، Nginx config (اختیاری) میں سب کچھ ٹھیک ہے۔

تو ہمیں کیا ضرورت ہے

Debian کی بنیاد پر مثالیں دی جائیں گی۔

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

اور لائبریریاں magickwand اس کے لیے، میرے معاملے میں ورژن 6 کے لیے

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

lua-imagick کی تعمیر

ہم ذخیرہ کو کلون کرتے ہیں (یا زپ لیں اور اسے کھولیں)

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

نیا تبصرہ شامل کریں