Don ɗan lokaci kaɗan yanzu, wahayi zuwa labarin
Wannan labarin ya zo don ceto
To me muke bukata
Za a bayar da misalai bisa Debian.
Shigar da nginx da nginx-extras
apt-get update
apt-get install nginx-extras
Ana shigar da LuaJIT
apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-dev
Sanya imagemagick
apt-get -y install imagemagick
da dakunan karatu sihiri da shi, a cikin akwati na don version 6
apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev
Gina lua-imagick
Muna rufe ma'ajiyar (ko ɗaukar zip ɗin mu cire shi)
cd ~
git clone https://github.com/isage/lua-imagick.git
cd lua-imagick
mkdir build
cd build
cmake ..
make
make install
Idan komai yayi kyau, zaku iya saita Nginx.
Zan ba da misali na saitin mai watsa shiri na baya, wanda, a zahiri, ke da alhakin sakewa. Sabar ta gaba tana da alaƙa, kuma tare da Nginx, inda caching ke faruwa na wani ɗan lokaci (kwanaki) da sauran abubuwa.
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
}
}
Abin da ake buƙata (fadada hoton a gefen gefuna) yana faruwa ta amfani da shi img:extent()
kuma an ayyana shi ta amfani da siga resize
da alama +
a karshen.
Akwai zaɓuɓɓuka masu zuwa:
- WxH (Ci gaba da juzu'i, yi amfani da girma mafi girma)
- WxH^ (A ci gaba da juzu'i, yi amfani da ƙananan girma (girma))
- WxH! (Yi watsi da rabon al'amari)
- WxH+ (Kiyaye ragi, ƙara iyakokin gefe)
Teburin taƙaitawa tare da girman sakamako
Nemi sigar uri
Girman Hoton Fitar
?girma = 400×200
200 × 200
?girma = 400×200^
400 × 400
?girma = 400×200!
400×200 (Ba daidai ba)
? Girman girma=400×200+
400×200 (daidaitacce)
Sakamakon
Idan aka yi la'akari da ƙarfi da sauƙi na wannan hanyar, zaku iya aiwatar da abubuwa tare da ma'ana mai rikitarwa, misali, ƙara alamar ruwa ko aiwatar da izini tare da iyakanceccen dama. Domin gano iyawar API ɗin don aiki tare da hotuna, kuna iya komawa zuwa takaddun laburare
source: www.habr.com