เจนเฉเจฃ เจเจพเจซเจผเฉ เจฆเฉเจฐ เจฒเจ, เจฒเฉเจ เจฆเฉเจเจฐเจพ เจชเฉเจฐเฉเจฐเจฟเจค
เจเจน เจฒเฉเจ เจฌเจเจพเจ
เจฒเจ เจเจเจ เจธเฉ
เจเจธ เจฒเจ เจธเจพเจจเฉเฉฐ เจเฉ เจเจพเจนเฉเจฆเจพ เจนเฉ
เจกเฉเจฌเฉเจ เจจ เจฆเฉ เจเจงเจพเจฐ 'เจคเฉ เจเจฆเจพเจนเจฐเจจเจพเจ เจฆเจฟเฉฑเจคเฉเจเจ เจเจพเจฃเจเฉเจเจเฅค
nginx เจ เจคเฉ nginx-extras เจจเฉเฉฐ เจธเจฅเจพเจชเจฟเจค เจเจฐเจจเจพ
apt-get update
apt-get install nginx-extras
LuaJIT เจเฉฐเจธเจเจพเจฒ เจเจฐเจจเจพ
apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-dev
เจเจฎเฉเจเจฎเฉเจเจฟเจ เจเฉฐเจธเจเจพเจฒ เจเจฐเจจเจพ
apt-get -y install imagemagick
เจ เจคเฉ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉเจเจ magickwand เจเจธเจฆเฉ เจฒเจ, เจฎเฉเจฐเฉ เจเฉเจธ เจตเจฟเฉฑเจ เจธเฉฐเจธเจเจฐเจฃ 6 เจฒเจ
apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev
เจฒเฉเจ-เจเจฎเฉเจเจฟเจ เจฌเจฃเจพเจเจฃเจพ
เจ เจธเฉเจ เจฐเจฟเจชเฉเจเจผเจเจฐเฉ เจจเฉเฉฐ เจเจฒเฉเจจ เจเจฐเจฆเฉ เจนเจพเจ (เจเจพเจ เจเจผเจฟเจช เจฒเจ เจ เจคเฉ เจเจธเจจเฉเฉฐ เจ เจจเจชเฉเจ เจเจฐเฉ)
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 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+ (เจชเจนเจฟเจฒเฉ-เจ เจจเฉเจชเจพเจค เจฐเฉฑเจเฉ, เจธเจพเจเจก เจฌเจพเจฐเจกเจฐ เจเฉเฉเฉ)
เจฐเฉเจธเจพเจเจเจผ เจจเจคเฉเจเจฟเจเจ เจฆเฉ เจจเจพเจฒ เจธเฉฐเจเฉเจช เจธเจพเจฐเจฃเฉ
เจฏเฉเจฐเฉ เจชเฉเจฐเจพเจฎเฉเจเจฐ เจฆเฉ เจฌเฉเจจเจคเฉ เจเจฐเฉ
เจเจเจเจชเฉเฉฑเจ เจเจฟเฉฑเจคเจฐ เจฆเจพ เจเจเจพเจฐ
?เจฐเฉเจธเจพเจเจเจผ=400ร200
200 ร 200
?resize=400ร200^
400 ร 400
?resize=400ร200!
400ร200 (เจ
เจจเฉเจชเจพเจคเจ เจจเจนเฉเจ)
?resize=400ร200+
400ร200 (เจ
เจจเฉเจชเจพเจคเจ)
เจจเจคเฉเจเจพ
เจเจธ เจชเจนเฉเฉฐเจ เจฆเฉ เจธเจผเจเจคเฉ เจ
เจคเฉ เจธเจฐเจฒเจคเจพ เจจเฉเฉฐ เจงเจฟเจเจจ เจตเจฟเฉฑเจ เจฐเฉฑเจเจฆเฉ เจนเฉเจ, เจคเฉเจธเฉเจ เจเจพเจซเจผเฉ เจเฉเฉฐเจเจฒเจฆเจพเจฐ เจคเจฐเจ เจจเจพเจฒ เจเฉเจเจผเจพเจ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจตเจพเจเจฐเจฎเจพเจฐเจเจธ เจจเฉเฉฐ เจเฉเฉเจจเจพ เจเจพเจ เจธเฉเจฎเจค เจชเจนเฉเฉฐเจ เจฆเฉ เจจเจพเจฒ เจ
เจงเจฟเจเจพเจฐ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเจจเจพเฅค เจเจฟเฉฑเจคเจฐเจพเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ API เจฆเฉ เจธเจฎเจฐเฉฑเจฅเจพ เจฆเจพ เจชเจคเจพ เจฒเจเจพเจเจฃ เจฒเจ, เจคเฉเจธเฉเจ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ เจฆเจธเจคเจพเจตเฉเจเจผเจพเจ เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเฉ เจธเจเจฆเฉ เจนเฉ
เจธเจฐเฉเจค: www.habr.com