๊ฝค ์ค๋ซ๋์, ๊ธฐ์ฌ์์ ์๊ฐ์ ๋ฐ์์ต๋๋ค. ์ด๋ฏธ์ง ํฌ๊ธฐ ์กฐ์ ์ ๋ค์์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฒ์ด ์ ๋๋ก ์๋ํ์ต๋๋ค. ํ์ง๋ง ๊ด๋ฆฌ์๊ฐ ์ผ๋ถ ์๋น์ค์ ์ ๋ก๋ํ๊ธฐ ์ํด ์ ํํ ํฌ๊ธฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์ผ ํ ๋ ํ๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด๋ ํด๋น ์๋น์ค์ ๊ธฐ์ ์ ์๊ตฌ ์ฌํญ์ด์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ณธ ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ 1200 ร 1200, ๊ทธ๋ฆฌ๊ณ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ๋ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์๋๋ค. ?ํฌ๊ธฐ ์กฐ์ =600ร400๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ๊ฐ์ฅ ์์ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ๋ฐ๋ผ ๋น๋ก์ ์ผ๋ก ์ถ์๋ ์ด๋ฏธ์ง๋ฅผ ์ป์ต๋๋ค. 400 ร 400. ๋ ๋์ ํด์๋(์ ์ค์ผ์ผ)์ ์ด๋ฏธ์ง๋ฅผ ์ป๋ ๊ฒ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ ๊ฒ๋ค. ?ํฌ๊ธฐ ์กฐ์ =1500ร1500 ๋ชจ๋ ๋์ผํ ์ด๋ฏธ์ง๋ฅผ ๋ฐํํฉ๋๋ค 1200 ร 1200
๊ธฐ์ฌ๊ฐ ๊ตฌํด์คฌ์ด์ Nginx๊ฐ Lua์ Lua ์์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋ ค๋ฉด - ImageMagick์ Lua pure-c ๋ฐ์ธ๋ฉ์ ์ ์ฉํฉ๋๋ค. ์ ํ์ด์ฌ์ด ์๋ ์ด ์๋ฃจ์ ์ ์ ํํ์๊น์? ๋น ๋ฅด๊ณ ํธ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ฌด ํ์ผ๋ ๋ง๋ค ํ์๋ ์๊ณ , ๋ชจ๋ ๊ฒ์ด Nginx ์ค์ ์ ๋ค์ด์์ต๋๋ค(ํ์ ์๋).
๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฒ์ ๋ฌด์์ผ๊น?
์์๋ ๋ค์์ ๊ธฐ์ค์ผ๋ก ์ ์๋ฉ๋๋ค. Debian.
nginx ๋ฐ nginx-extras ์ค์น
apt-get update
apt-get install nginx-extrasLuaJIT ์ค์น
apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-devImagemagick ์ค์น
apt-get -y install imagemagick๊ทธ๋ฆฌ๊ณ ๋์๊ด ์์ ๋ด ๋ด ๊ฒฝ์ฐ์๋ ๋ฒ์ 6์ ๋ํด์์
apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-devlua-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 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^ (์ข ํก๋น ์ ์ง, ๋ ๋ฎ์ ์ฐจ์ ์ฌ์ฉ(์๋ฅด๊ธฐ))
- ๊ฐ๋กx์ธ๋ก! (์ข ํก๋น ๋ฌด์)
- WxH+ (์ข ํก๋น ์ ์ง, ์ธก๋ฉด ํ ๋๋ฆฌ ์ถ๊ฐ)
ํฌ๊ธฐ ์กฐ์ ๊ฒฐ๊ณผ๊ฐ ํฌํจ๋ ์์ฝ ํ
์์ฒญ uri ๋งค๊ฐ๋ณ์
์ถ๋ ฅ ์ด๋ฏธ์ง ํฌ๊ธฐ
?ํฌ๊ธฐ ์กฐ์ =400ร200
200 ร 200
?ํฌ๊ธฐ ์กฐ์ =400ร200^
400 ร 400
?ํฌ๊ธฐ ์กฐ์ =400ร200!
400ร200 (๋น๋กํ์ง ์์)
?ํฌ๊ธฐ ์กฐ์ =400ร200+
400ร200(๋น๋ก)

ํฉ๊ณ
์ด ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋ ฅํจ๊ณผ ๋จ์์ฑ์ ๊ณ ๋ คํ๋ฉด ์ํฐ๋งํฌ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ํ๋ ์ก์ธ์ค๋ก ๊ถํ์ ๋ถ์ฌํ๋ ๋ฑ ์๋นํ ๋ณต์กํ ๋ ผ๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด๋ฏธ์ง ์์ ์ ์ํ API ๊ธฐ๋ฅ์ ๋ํด ์์๋ณด๋ ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
์ถ์ฒ : habr.com
