ืืืจ ืื ืืจืื ืืื, ืืืฉืจืืช ืืืืืจ
ืืืืืจ ืืื ืื ืืืฆืื
ืื ืื ืื ืื ื ืฆืจืืืื
ืืืืืืืช ืืื ืชื ื ืขื ืกืื ืืืืื.
ืืชืงื ืช nginx ืืชืืกืคืืช nginx
apt-get update
apt-get install nginx-extras
ืืชืงื ืช LuaJIT
apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-dev
ืืชืงื ืช imagemagick
apt-get -y install imagemagick
ืืกืคืจืืืช ืฉืจืืื ืงืกืืื ืืืื, ืืืงืจื ืฉืื ืืืจืกื 6
apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev
ืื ืืืช lua-imagick
ืื ืื ื ืืฉืืืื ืืช ืืืืืจ (ืื ืืืงืืื ืืช ื-zip ืืคืืจืงืื ืืืชื)
cd ~
git clone https://github.com/isage/lua-imagick.git
cd lua-imagick
mkdir build
cd build
cmake ..
make
make install
ืื ืืื ืืื ืืฉืืจื, ืืชื ืืืื ืืืืืืจ ืืช Nginx.
ืื ื ืืชื ืืืืื ืืชืฆืืจื ืฉื ืืืจื ืืงืฆื ืืืืืจื, ืฉืืืขืฉื ืืืจืื ืืฉืื ืื ืืืืื. ืืื ืืืขื ืง ืขื ืืื ืืฉืจืช ืืงืืื, ืื ืขื Nginx, ืฉื ืืชืจืืฉ ืฉืืืจื ืืืืืื ืืคืจืง ืืื ืืกืืื (ืืืื) ืืืืจืื ืืืจืื.
ืชืฆืืจืช nginx backend
# 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
}
}
ืื ืฉื ืืจืฉ (ืืจืืืช ืืชืืื ื ืกืืื ืืงืฆืืืช) ืงืืจื ืืืืฆืขืืช img:extent()
ืืืืืืจ ืืืืฆืขืืช ืืคืจืืืจ resize
ืขื ืฉืื +
ืืกืืฃ.
ืืืคืฉืจืืืืช ืืืืืช ืืืื ืืช:
- WxH (ืฉืืืจ ืขื ืืืก ืจืืื-ืืืื, ืืฉืชืืฉ ืืืื ืืืื ืืืชืจ)
- WxH^ (ืฉืืืจ ืขื ืืืก ืจืืื-ืืืื, ืืฉืชืืฉ ืืืื ื ืืื ืืืชืจ (ืืชืื))
- WxH! (ืืชืขืื ืืืืก ืจืืื-ืืืื)
- WxH+ (ืฉืืืจ ืขื ืืืก ืจืืื-ืืืื, ืืืกืฃ ืืืืืืช ืฆืืืืื)
ืืืืช ืกืืืื ืขื ืชืืฆืืืช ืฉืื ืื ืืืื
ืืงืฉ ืคืจืืืจ Uri
ืืืื ืชืืื ืช ืคืื
?ืฉืื ืื ืืืื=400ร200
200 ร 200
?ืฉืื ืื ืืืื=400ร200^
400 ร 400
?ืฉืื ืื ืืืื=400ร200!
400ร200 (ืื ืคืจืืคืืจืฆืืื ืื)
?ืฉืื ืื ืืืื=400ร200+
400ร200 (ืคืจืืคืืจืฆืืื ืื)
ืกื ืืื
ืืืชืืฉื ืืขืืฆืื ืืืคืฉืืืช ืฉื ืืืฉื ืื, ืืชื ืืืื ืืืืฉื ืืืจืื ืขื ืืืืืื ืืืจืื ืืืื, ืืืฉื, ืืืกืคืช ืกืืื ื ืืื ืื ืืืฉืื ืืจืฉืืืช ืขื ืืืฉื ืืืืืืช. ืขื ืื ืช ืืืจืจ ืืช ืืืืืืช ื-API ืืขืืืื ืขื ืชืืื ืืช, ื ืืชื ืืขืืื ืืชืืขืื ืืกืคืจืืื
ืืงืืจ: www.habr.com