ืฉื ื” ืืช ื’ื•ื“ืœ ื”ืชืžื•ื ื•ืช ืชื•ืš ื›ื“ื™ ืฉื™ืžื•ืฉ ื‘ืืžืฆืขื•ืช Nginx ื•- LuaJIT (OpenResty)

ื›ื‘ืจ ื“ื™ ื”ืจื‘ื” ื–ืžืŸ, ื‘ื”ืฉืจืืช ื”ืžืืžืจ ืฉื ื” ืืช ื’ื•ื“ืœ ื”ืชืžื•ื ื•ืช ืชื•ืš ื›ื“ื™ ืชื ื•ืขื” ืฉื™ื ื•ื™ ื’ื•ื“ืœ ื”ืชืžื•ื ื” ื”ื•ื’ื“ืจ ื‘ืืžืฆืขื•ืช ngx_http_image_filter_module ื•ื”ื›ืœ ืขื‘ื“ ื›ืžื• ืฉืฆืจื™ืš. ืื‘ืœ ื‘ืขื™ื” ืื—ืช ื”ืชืขื•ืจืจื” ื›ืฉื”ืžื ื”ืœ ื”ื™ื” ืฆืจื™ืš ืœืงื‘ืœ ืชืžื•ื ื•ืช ื‘ืžื™ื“ื•ืช ืžื“ื•ื™ืงื•ืช ืœื”ืขืœืื” ืœืฉื™ืจื•ืชื™ื ืžืกื•ื™ืžื™ื, ื›ื™... ืืœื” ื”ื™ื• ื”ื“ืจื™ืฉื•ืช ื”ื˜ื›ื ื™ื•ืช ืฉืœื”ื. ืœื“ื•ื’ืžื”, ืื ื™ืฉ ืœื ื• ืชืžื•ื ื” ืžืงื•ืจื™ืช ื‘ื’ื•ื“ืœ 1200 ร— 1200, ื•ื›ืืฉืจ ืžืฉื ื™ื ื’ื•ื“ืœ ืื ื• ื›ื•ืชื‘ื™ื ืžืฉื”ื• ื›ืžื• ?ืฉื™ื ื•ื™ ื’ื•ื“ืœ=600ร—400, ืื– ื ืงื‘ืœ ืชืžื•ื ื” ืžื•ืคื—ืชืช ื‘ืื•ืคืŸ ืคืจื•ืคื•ืจืฆื™ื•ื ืœื™ ืœืื•ืจืš ื”ืงืฆื” ื”ืงื˜ืŸ ื‘ื™ื•ืชืจ, ื’ื•ื“ืœ 400 ร— 400. ืื™ ืืคืฉืจ ื’ื ืœื”ืฉื™ื’ ืชืžื•ื ื” ื‘ืจื–ื•ืœื•ืฆื™ื” ื’ื‘ื•ื”ื” ื™ื•ืชืจ (ื™ื•ืงืจื”). ื”ึธื”ึตืŸ. ?ืฉื™ื ื•ื™ ื’ื•ื“ืœ=1500ร—1500 ื™ื—ื–ื™ืจ ืืช ืื•ืชื” ืชืžื•ื ื” 1200 ร— 1200

ื”ืžืืžืจ ื”ื–ื” ื‘ื ืœื”ืฆื™ืœ OpenResty: ื”ืคื™ื›ืช NGINX ืœืฉืจืช ื™ื™ืฉื•ืžื™ื ืžืœื ืœื”ื‘ื™ืŸ ืื™ืš Nginx ืขื•ื‘ื“ ืขื Lua ื•ื”ืกืคืจื™ื™ื” ืขืฆืžื” ืขื‘ื•ืจ Lua isage/lua-imagegick - ื›ืจื™ื›ื•ืช Lua pure-c ืœ-ImageMagick. ืžื“ื•ืข ื ื‘ื—ืจ ื”ืคืชืจื•ืŸ ื”ื–ื”, ื•ืœื, ื ื ื™ื—, ืžืฉื”ื• ื‘ืคื™ืชื•ืŸ - ื›ื™ ื”ื•ื ืžื”ื™ืจ ื•ื ื•ื—. ืืชื” ืืคื™ืœื• ืœื ืฆืจื™ืš ืœื™ืฆื•ืจ ืงื‘ืฆื™ื, ื”ื›ืœ ื‘ืกื“ืจ ื‘ืชืฆื•ืจืช Nginx (ืื•ืคืฆื™ื•ื ืœื™).

ืื– ืžื” ืื ื—ื ื• ืฆืจื™ื›ื™ื

ื“ื•ื’ืžืื•ืช ื™ื™ื ืชื ื• ืขืœ ืกืžืš ื“ื‘ื™ืืŸ.

ื”ืชืงื ืช 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 (ืคืจื•ืคื•ืจืฆื™ื•ื ืœื™)

ืฉื ื” ืืช ื’ื•ื“ืœ ื”ืชืžื•ื ื•ืช ืชื•ืš ื›ื“ื™ ืฉื™ืžื•ืฉ ื‘ืืžืฆืขื•ืช Nginx ื•- LuaJIT (OpenResty)

ืกืš ื”ื›ืœ

ื‘ื”ืชื—ืฉื‘ ื‘ืขื•ืฆืžื” ื•ื‘ืคืฉื˜ื•ืช ืฉืœ ื’ื™ืฉื” ื–ื•, ืืชื” ื™ื›ื•ืœ ืœื™ื™ืฉื ื“ื‘ืจื™ื ืขื ื”ื™ื’ื™ื•ืŸ ืžื•ืจื›ื‘ ืœืžื“ื™, ืœืžืฉืœ, ื”ื•ืกืคืช ืกื™ืžื ื™ ืžื™ื ืื• ื™ื™ืฉื•ื ื”ืจืฉืื•ืช ืขื ื’ื™ืฉื” ืžื•ื’ื‘ืœืช. ืขืœ ืžื ืช ืœื‘ืจืจ ืืช ื™ื›ื•ืœื•ืช ื”-API ืœืขื‘ื•ื“ื” ืขื ืชืžื•ื ื•ืช, ื ื™ืชืŸ ืœืขื™ื™ืŸ ื‘ืชื™ืขื•ื“ ื”ืกืคืจื™ื™ื” isage/lua-imagegick

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”