Depi kèk tan kounye a, enspire pa atik la
Atik sa a te vin sekou
Se konsa, sa nou bezwen
Egzanp yo pral bay ki baze sou Debian.
Enstale nginx ak nginx-extras
apt-get update
apt-get install nginx-extras
Enstale LuaJIT
apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-dev
Enstale imagemagick
apt-get -y install imagemagick
ak bibliyotèk majik pou li, nan ka mwen an pou vèsyon 6
apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev
Bati lua-imagick
Nou klonaj depo a (oswa pran postal la epi depake li)
cd ~
git clone https://github.com/isage/lua-imagick.git
cd lua-imagick
mkdir build
cd build
cmake ..
make
make install
Si tout bagay ale byen, ou ka configured Nginx.
Mwen pral bay yon egzanp nan konfigirasyon an nan lame a backend, ki, an reyalite, se responsab pou redimansyonman. Li se proxy pa sèvè devan an, tou ak Nginx, kote kachèt rive pou yon sèten peryòd tan (jou) ak lòt bagay.
nginx backend konfigirasyon
# 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
}
}
Ki sa ki te mande (agrandi imaj la alantou bor yo) k ap pase lè l sèvi avèk img:extent()
epi li defini lè l sèvi avèk paramèt la resize
ak yon siy +
nan fen an.
Opsyon sa yo disponib:
- WxH (Kenbe rapò aspè, sèvi ak pi wo dimansyon)
- WxH^ (Kenbe rapò aspè yo, sèvi ak pi ba dimansyon (rekòt))
- WxH! (Ignore rapò aspè)
- WxH + (Kenbe rapò aspè yo, ajoute fwontyè bò)
Tablo rezime ak rezilta redimansyon
Mande paramèt uri
Gwosè Imaj Sòti
?resize=400×200
200 × 200
?resize=400×200^
400 × 400
?resize=400×200!
400 × 200 (Pa pwopòsyonèl)
?resize=400×200+
400×200 (pwopòsyonèl)
Total
Lè ou konsidere pouvwa ak senplisite apwòch sa a, ou ka aplike bagay sa yo ak yon lojik byen konplèks, pou egzanp, ajoute filigran oswa aplike otorizasyon ak aksè limite. Pou chèche konnen kapasite API a pou travay ak imaj, ou ka refere a dokiman bibliyotèk la
Sous: www.habr.com