Aspalditik, artikuluan inspiratuta
Artikulu hau erreskatatu zen
Beraz, zer behar dugu
Adibideak Debian oinarrituta emango dira.
Nginx eta nginx-extras instalatzen
apt-get update
apt-get install nginx-extras
LuaJIT instalatzen
apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-dev
Imagemagick instalatzen
apt-get -y install imagemagick
eta liburutegiak makila magikoa horri, nire kasuan 6. bertsiorako
apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev
Lua-imagick eraikitzea
Biltegia klonatzen dugu (edo zip-a hartu eta deskonprimitu)
cd ~
git clone https://github.com/isage/lua-imagick.git
cd lua-imagick
mkdir build
cd build
cmake ..
make
make install
Dena ondo joan bada, Nginx konfigura dezakezu.
Backend ostalariaren konfigurazioaren adibide bat emango dut, hain zuzen ere, tamaina aldatzeaz arduratzen dena. Aurrealdeko zerbitzariak proxy egiten du, baita Nginx-ekin ere, non caching denbora-tarte jakin batean (egunetan) eta beste gauza batzuetan gertatzen den.
nginx backend konfigurazioa
# 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
}
}
Behar zena (irudia ertzetan zabaltzea) erabiliz gertatzen da img:extent()
eta parametroa erabiliz definitzen da resize
seinale batekin +
amaieran.
Aukera hauek daude eskuragarri:
- WxH (Mantendu aspektu-erlazioa, erabili dimentsio handiagoa)
- WxH^ (Mantendu aspektu-erlazioa, erabili beheko dimentsioa (moztu))
- WxH! (Ez ikusi aspektu-erlazioa)
- WxH+ (Mantendu aspektu-erlazioa, gehitu alboko ertzak)
Taula laburpena tamaina aldatzeko emaitzekin
Eskatu uri parametroa
Irteerako irudiaren tamaina
?tamaina aldatu=400Γ200
200 Γ 200
?tamaina aldatu=400Γ200^
400 Γ 400
?tamaina aldatu=400Γ200!
400Γ200 (ez proportzionala)
?tamaina aldatu=400Γ200+
400Γ200 (proportzionala)
Guztira
Ikuspegi honen boterea eta sinpletasuna kontuan hartuta, logika nahiko konplexuarekin gauzatu ditzakezu, adibidez, ur-markak gehitzea edo sarbide mugatuko baimena ezartzea. Irudiekin lan egiteko APIak dituen gaitasunak ezagutzeko, liburutegiko dokumentazioa jo dezakezu
Iturria: www.habr.com