Pikeun sababaraha waktos ayeuna, diideuan ku artikel
Artikel ieu sumping ka nyalametkeun teh
Janten naon anu urang peryogikeun
Conto bakal dipasihkeun dumasar kana Debian.
Masang nginx sareng nginx-extras
apt-get update
apt-get install nginx-extras
Masang LuaJIT
apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-dev
Masang imagemagic
apt-get -y install imagemagick
jeung perpustakaan sulap ka dinya, bisi kuring pikeun versi 6
apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev
Wangunan lua-imagick
Urang clone gudang (atanapi nyandak zip sareng ngabongkar éta)
cd ~
git clone https://github.com/isage/lua-imagick.git
cd lua-imagick
mkdir build
cd build
cmake ..
make
make install
Upami sadayana lancar, anjeun tiasa ngonpigurasikeun Nginx.
Kuring bakal masihan conto config tina host backend, nu, kanyataanna, tanggung jawab pangaturan ukuran jadi. Éta diproksi ku server hareup, ogé sareng Nginx, dimana cache lumangsung pikeun sababaraha waktos (dinten) sareng hal-hal sanés.
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
}
}
Naon anu diperlukeun (ngalegaan gambar sabudeureun edges) kajadian ngagunakeun img:extent()
sarta dihartikeun ngagunakeun parameter resize
kalawan tanda +
di tungtung.
Pilihan di handap ieu sayogi:
- WxH (Simpen rasio aspék, paké diménsi anu langkung luhur)
- WxH^ (Tetep rasio aspék, nganggo diménsi handap (potongan))
- WxH! (Abaikan rasio aspék)
- WxH+ (Tetep rasio aspék, tambahkeun wates sisi)
Tabel kasimpulan sareng hasil ukuran
Ménta parameter uri
Ukuran Gambar Kaluaran
?ukuran=400×200
200 × 200
?ukuran=400×200^
400 × 400
?ukuran=400×200!
400×200 (Teu sabanding)
?ukuran=400×200+
400×200 (Proporsional)
hasil
Nganggap kakuatan sareng kesederhanaan pendekatan ieu, anjeun tiasa ngalaksanakeun hal-hal kalayan logika anu rada rumit, contona, nambihan watermark atanapi ngalaksanakeun otorisasi kalayan aksés terbatas. Pikeun milarian kamampuan API pikeun damel sareng gambar, anjeun tiasa ningali kana dokuméntasi perpustakaan
sumber: www.habr.com