āĻŦā§āĻļ āĻāĻŋāĻā§āĻĻāĻŋāĻ¨ āĻ§āĻ°ā§āĻ āĻ˛ā§āĻāĻžāĻāĻŋ āĻĻā§āĻā§ āĻ
āĻ¨ā§āĻĒā§āĻ°āĻžāĻŖāĻŋāĻ¤
āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻāĻŋ āĻ°ā§āĻ¸āĻāĻŋāĻ āĻāĻ¸ā§āĻāĻŋāĻ˛
āĻ¤āĻžāĻ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻŋ āĻĻāĻ°āĻāĻžāĻ°
āĻĄā§āĻŦāĻŋāĻ¯āĻŧāĻžāĻ¨ā§āĻ° āĻāĻĒāĻ° āĻāĻŋāĻ¤ā§āĻ¤āĻŋ āĻāĻ°ā§ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻŦā§āĨ¤
nginx āĻāĻŦāĻ nginx-āĻ āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻāĻ¨āĻ¸ā§āĻāĻ˛ āĻāĻ°āĻž āĻšāĻā§āĻā§
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
āĻāĻŦāĻ āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ āĻŽā§āĻ¯āĻžāĻāĻŋāĻāĻāĻ¯āĻŧāĻžāĻ¨ā§āĻĄ āĻāĻāĻž, āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ 6 āĻāĻ¨ā§āĻ¯ āĻāĻŽāĻžāĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§
apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev
āĻŦāĻŋāĻ˛ā§āĻĄāĻŋāĻ lua-imagick
āĻāĻŽāĻ°āĻž āĻ¸āĻāĻā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛āĻāĻŋ āĻā§āĻ˛ā§āĻ¨ āĻāĻ°āĻŋ (āĻŦāĻž āĻāĻŋāĻĒāĻāĻŋ āĻ¨āĻŋāĻ¯āĻŧā§ āĻāĻāĻŋ āĻāĻ¨āĻĒā§āĻ¯āĻžāĻ āĻāĻ°āĻŋ)
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+ (āĻāĻĻāĻ°ā§āĻļ-āĻ āĻ¨ā§āĻĒāĻžāĻ¤ āĻ°āĻžāĻā§āĻ¨, āĻĒāĻžāĻļā§āĻ° āĻ¸ā§āĻŽāĻžāĻ¨āĻž āĻ¯ā§āĻ āĻāĻ°ā§āĻ¨)
āĻāĻāĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§āĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻ¸āĻš āĻ¸āĻžāĻ°āĻžāĻāĻļ āĻā§āĻŦāĻŋāĻ˛
āĻāĻāĻ°āĻŋ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ
āĻ¨ā§āĻ°ā§āĻ§ āĻāĻ°ā§āĻ¨
āĻāĻāĻāĻĒā§āĻ āĻāĻŽā§āĻ āĻ¸āĻžāĻāĻ
?resize=400Ã200
200 Ã 200
?resize=400Ã200^
400 Ã 400
?resize=400Ã200!
400Ã200 (āĻāĻ¨ā§āĻĒāĻžāĻ¤āĻŋāĻ āĻ¨āĻ¯āĻŧ)
?resize=400Ã200+
400Ã200 (āĻāĻ¨ā§āĻĒāĻžāĻ¤āĻŋāĻ)
āĻĢāĻ˛āĻžāĻĢāĻ˛
āĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻļāĻā§āĻ¤āĻŋ āĻāĻŦāĻ āĻ¸āĻ°āĻ˛āĻ¤āĻž āĻŦāĻŋāĻŦā§āĻāĻ¨āĻž āĻāĻ°ā§, āĻāĻĒāĻ¨āĻŋ āĻŦā§āĻļ āĻāĻāĻŋāĻ˛ āĻ¯ā§āĻā§āĻ¤āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻāĻŋāĻ¨āĻŋāĻ¸āĻā§āĻ˛āĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻ¯āĻŧāĻžāĻāĻžāĻ°āĻŽāĻžāĻ°ā§āĻ āĻ¯ā§āĻ āĻāĻ°āĻž āĻŦāĻž āĻ¸ā§āĻŽāĻŋāĻ¤ āĻ
ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸ā§āĻ° āĻ¸āĻžāĻĨā§ āĻ
āĻ¨ā§āĻŽā§āĻĻāĻ¨ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°āĻžāĨ¤ āĻāĻŦāĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ API āĻāĻ° āĻā§āĻˇāĻŽāĻ¤āĻž āĻā§āĻāĻā§ āĻŦā§āĻ° āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻĒāĻ¨āĻŋ āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ āĻĄāĻā§āĻŽā§āĻ¨ā§āĻā§āĻļāĻ¨ āĻāĻ˛ā§āĻ˛ā§āĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨
āĻāĻ¤ā§āĻ¸: www.habr.com