Juba mõnda aega artiklist inspireerituna
See artikkel tuli appi
Mida me siis vajame
Näiteid tuuakse Debiani põhjal.
Nginxi ja nginx-lisade installimine
apt-get update
apt-get install nginx-extras
LuaJITi installimine
apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-dev
Imagemagicki installimine
apt-get -y install imagemagick
ja raamatukogud võlukepp sellele, minu puhul versioonile 6
apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev
Lua-imagicki ehitamine
Kloonime hoidla (või võtame tõmbluku ja pakime selle lahti)
cd ~
git clone https://github.com/isage/lua-imagick.git
cd lua-imagick
mkdir build
cd build
cmake ..
make
make install
Kui kõik läks hästi, saate Nginxi konfigureerida.
Toon näite taustaprogrammi hosti konfiguratsioonist, mis tegelikult vastutab suuruse muutmise eest. Seda puhverdab eesserver, ka Nginxiga, kus vahemällu salvestamine toimub teatud aja jooksul (päevad) ja muud.
nginxi taustaprogrammi konfiguratsioon
# 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
}
}
Nõutav (pildi laiendamine servade ümber) toimub kasutades img:extent()
ja on määratletud parameetri abil resize
allkirjastatud +
lõpus.
Saadaval on järgmised valikud.
- LxK (säilitage kuvasuhe, kasutage suuremat mõõdet)
- LxK^ (Säilitage kuvasuhe, kasutage väiksemat mõõdet (kärpimine))
- PxK! (Ignoreeri kuvasuhet)
- WxH+ (säilitage kuvasuhe, lisage külgmised äärised)
Kokkuvõttev tabel suuruse muutmise tulemustega
Küsi uri parameetrit
Väljundpildi suurus
?resize=400×200
200 × 200
?resize=400×200^
400 × 400
?resize=400×200!
400 × 200 (ei ole proportsionaalne)
?resize=400×200+
400 × 200 (proportsionaalne)
Summaarne
Arvestades selle lähenemise võimsust ja lihtsust, saate rakendada asju üsna keerulise loogikaga, näiteks lisada vesimärke või rakendada piiratud juurdepääsuga autoriseerimist. API võimaluste väljaselgitamiseks piltidega töötamiseks võite vaadata raamatukogu dokumentatsiooni
Allikas: www.habr.com