Al in hiel skoft no, ynspirearre troch it artikel
Dit artikel kaam ta de rêding
Dus wat hawwe wy nedich
Foarbylden sille wurde jûn op basis fan Debian.
Ynstallaasje fan nginx en nginx-ekstra's
apt-get update
apt-get install nginx-extras
Ynstallaasje fan LuaJIT
apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-dev
Ynstallaasje fan imagemagick
apt-get -y install imagemagick
en biblioteken magicwand oan it, yn myn gefal foar ferzje 6
apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev
Bouwe lua-imaging
Wy klonje it repository (of nim de zip en útpakke it)
cd ~
git clone https://github.com/isage/lua-imagick.git
cd lua-imagick
mkdir build
cd build
cmake ..
make
make install
As alles goed gie, kinne jo Nginx konfigurearje.
Ik sil in foarbyld jaan fan 'e konfiguraasje fan' e backend-host, dy't yn feite ferantwurdlik is foar it feroarjen fan grutte. It wurdt proxed troch de front tsjinner, ek mei Nginx, dêr't caching foar in bepaalde perioade fan tiid (dagen) en oare dingen.
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
}
}
Wat wie nedich (útwreidzje it byld om 'e rânen) bart mei help img:extent()
en wurdt definiearre mei de parameter resize
mei in teken +
oan de ein.
De folgjende opsjes binne beskikber:
- WxH (Hâld aspekt-ferhâlding, brûk hegere dimensje)
- WxH^ (Hâld aspekt-ferhâlding, brûk legere dimensje (gewaaks))
- WxH! (Negearje aspektferhâlding)
- WxH+ (Hâld aspektferhâlding, foegje sydgrinzen ta)
Gearfetting tabel mei resize resultaten
Uri-parameter oanfreegje
Output Image Grutte
?grutte=400×200
200 × 200
?grutte=400×200^
400 × 400
?grutte feroarje=400×200!
400 × 200 (Net evenredich)
?grutte feroarje=400×200+
400 × 200 (proporsjoneel)
It resultaat
Sjoen de krêft en ienfâld fan dizze oanpak, kinne jo dingen útfiere mei frij komplekse logika, bygelyks wettermerken tafoegje of autorisaasje útfiere mei beheinde tagong. Om de mooglikheden fan 'e API te finen foar it wurkjen mei ôfbyldings, kinne jo ferwize nei de biblioteekdokumintaasje
Boarne: www.habr.com