کافی عرصے سے، مضمون سے متاثر ہو کر
یہ مضمون بچاؤ کے لیے آیا
تو ہمیں کیا ضرورت ہے
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 (متناسب)
کل
اس نقطہ نظر کی طاقت اور سادگی کو مدنظر رکھتے ہوئے، آپ چیزوں کو کافی پیچیدہ منطق کے ساتھ نافذ کر سکتے ہیں، مثال کے طور پر، واٹر مارکس شامل کرنا یا محدود رسائی کے ساتھ اجازت کو نافذ کرنا۔ تصاویر کے ساتھ کام کرنے کے لیے API کی صلاحیتوں کو جاننے کے لیے، آپ لائبریری دستاویزات کا حوالہ دے سکتے ہیں۔
ماخذ: www.habr.com