Hanova ny sary amin'ny lalitra mampiasa Nginx sy LuaJIT (OpenResty)

Efa ela be izao, nahazo tsindrimandry avy amin'ilay lahatsoratra Hanova ny haben'ny sary amin'ny lalitra Ny fanovana ny sary dia namboarina tamin'ny fampiasana ngx_http_image_filter_module ary nandeha araka ny tokony ho izy ny zava-drehetra. Saingy nisy olana iray nipoitra rehefa nila nahazo sary misy refy marina ny mpitantana mba hampidirana amin'ny serivisy sasany, satria... ireo no fepetra ara-teknika notakian'izy ireo. Ohatra, raha manana sary tany am-boalohany ny habeny 1200 Γ— 1200, ary rehefa manova ny habeny dia manoratra zavatra toy ny ?resize=600Γ—400, avy eo dia mahazo sary mihena mitovitovy amin'ny sisiny kely indrindra, ny habeny 400 Γ— 400. Tsy azo atao koa ny mahazo sary manana resolution avo kokoa (upscale). Ireo. ?resize=1500Γ—1500 dia hamerina ny sary mitovy 1200 Γ— 1200

Tonga hamonjy ity lahatsoratra ity OpenResty: mamadika ny NGINX ho mpizara fampiharana feno mba hahatakarana ny fomba fiasan'i Nginx amin'i Lua sy ny tranomboky ho an'i Lua isaage/lua-imagick - Famatorana Lua pure-c amin'ny ImageMagick. Nahoana no nofidina io vahaolana io, fa tsy, ohatra, zavatra amin'ny python - satria haingana sy mety. Tsy mila mamorona rakitra akory ianao, tsara ny zava-drehetra ao amin'ny config Nginx (tsy voatery).

Inona Γ ry no ilaintsika

Ny ohatra dia homena mifototra amin'ny Debian.

Fametrahana nginx sy nginx-extras

apt-get update
apt-get install nginx-extras

Fametrahana ny LuaJIT

apt-get -y install lua5.1 luajit-5.1 libluajit-5.1-dev

Fametrahana imagemagick

apt-get -y install imagemagick

sy tranomboky magickwand amin'izany, raha ny momba ahy ho an'ny version 6

apt-cache search libmagickwand
apt-get -y install libmagickwand-6.q16-3 libmagickwand-6.q16-dev

Fanorenana lua-imagick

Manao clone ny repository izahay (na alao ny zip ary esory izany)

cd ~
git clone https://github.com/isage/lua-imagick.git
cd lua-imagick
mkdir build
cd build
cmake ..
make
make install

Raha mandeha tsara ny zava-drehetra dia azonao atao ny manamboatra Nginx.

Hanome ohatra momba ny config an'ny mpampiantrano backend aho, izay, raha ny marina, dia tompon'andraikitra amin'ny fanovana ny habeny. Izy io dia atolotry ny mpizara eo aloha, miaraka amin'i Nginx, izay misy ny caching mandritra ny fe-potoana (andro) sy zavatra hafa.

nginx backend config

# 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
    }
}

Ny zavatra takiana (manitatra ny sary manodidina ny sisiny) dia mitranga amin'ny fampiasana img:extent() ary voafaritra amin'ny fampiasana ny paramètre resize misy famantarana + amin'ny farany.

Misy ireto safidy manaraka ireto:

  • WxH (Tazony ny tahan'ny lafiny, ampiasao ny refy ambony)
  • WxH^ (Tazony ny aspect-ratio, ampiasao ny refy ambany (vovony))
  • WxH! (Tsy raharahaina ny aspect ratio)
  • WxH+ (Tazony ny aspect ratio, ampio sisiny)

Tabilao famintinana misy valiny ovaina

Mangataha uri parameter
Haben'ny sary Output

?resize=400Γ—200
200 Γ— 200

?resize=400Γ—200^
400 Γ— 400

?resize=400Γ—200!
400Γ—200 (Tsy mifandanja)

?resize=400Γ—200+
400Γ—200 (Mitovy)

Hanova ny sary amin'ny lalitra mampiasa Nginx sy LuaJIT (OpenResty)

Ny vokany

Raha jerena ny hery sy ny fahatsoran'ity fomba fiasa ity, dia azonao atao ny mampihatra zavatra miaraka amin'ny lojika saro-takarina, ohatra, manampy mari-pamantarana na fampiharana fahazoan-dΓ lana amin'ny fidirana voafetra. Mba hahitana ny fahaizan'ny API miasa amin'ny sary dia azonao atao ny mijery ny antontan-taratasy momba ny tranomboky isaage/lua-imagick

Source: www.habr.com

Add a comment