рд╣рдорд╛рд░реЗ рд╕рднреА рдмрд╛рд╣рд░реА рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓реЛрдХрдкреНрд░рд┐рдп рдирдЧреНрдиреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рддреЗрдЬ рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрддреНрдкрд╛рдж рднреА рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рдирдИ рд╕реЗрд╡рд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ, рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ, рдкреБрд░рд╛рдиреЗ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рджрд░реНрд╢рдХреЛрдВ рдФрд░ рд▓реЛрдб рдХреЗрд╡рд▓ рдмрдврд╝ рд░рд╣рд╛ рд╣реИред рдЕрдм рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рд╣рдордиреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЧрддрд┐ рджреА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреА рдФрд░ рдкреНрд░рднрд╛рд╡рд┐рдд рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдФрд░ рджреЛрд╖ рд╕рд╣рдирд╢реАрд▓рддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рдЗрд╕ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЕрдкрдиреА рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджрд┐рдпрд╛ред рдпрд╣ "рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ nginx" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред
рдЕрд░реНрдерд╛рддреН,
рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдореЙрдбреНрдпреВрд▓ (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ LUA) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд╛рджреБрдИ рдЪреАрдЬреЗрдВ рдЬрд▓реНрджреА рдФрд░ рдордЬрд╝рдмреВрддреА рд╕реЗ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рд╕рдорд╛рдзрд╛рди
рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░рдХреЛрдВ рдХреЛ рд▓реЗрдВ:
- рдЖрд╡реЗрджрди рддрд░реНрдХ рдХреА рдЬрдЯрд┐рд▓рддрд╛,
- рдЖрд╡реЗрджрди рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛,
- рджрд░реНрд╢рдХреЛрдВ рдХрд╛ рдЖрдХрд╛рд░ред
рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рд╕реЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрддреНрддрд░рджрд╛рдпреА рдФрд░ рддреЗрдЬ, рдХрднреА-рдХрднреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░рдЦрдирд╛ рднреА рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рднреМрдЧреЛрд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдЙрддреНрдкрд╛рдж рдмрд╣реБ-рдШрдЯрдХ рдмрди рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕реА рд╕рдордп, рдЬрд╡рд╛рдмрджреЗрд╣реА рдФрд░ рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рдордирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдЖрдк рд╕рдм рдХреБрдЫ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдиреНрдп рддрдХрдиреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд░реАрдореЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛ рдФрд░ рд╣рдордиреЗ рдЗрд╕реЗ рдзреАрд░реЗ-рдзреАрд░реЗ рдлрд┐рд░ рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЖрдзрд╛рд░ рдЕрд╕реЗрдВрдмрд▓реА
рдУрдкрдирд░реЗрд╕реНрдЯреА (nginx + LUA) рдерд╛ред рдХреНрдпреЛрдВ рдПрд▓.рдпреВ.рдП. Cgi, Fastcgi рдФрд░ рдЕрдиреНрдп cgi рдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рдмрд┐рдирд╛, рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рд╕реБрдВрджрд░ рдФрд░ рддреЗрдЬрд╝ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реАрдзреЗ рдирдЧреАрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдкрд┐рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рди рдХреЗрд╡рд▓ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд╕рд╛рде, рдмрд▓реНрдХрд┐ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рднреАред рдЙрд╕реА рд╕рдордп, рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд┐рдП рдмрд┐рдирд╛, рдХреЙрд▓рдмреИрдХ рдХреЗ рдмрд┐рдирд╛, рдореМрдЬреВрджрд╛ nginx рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреИрдХрдПрдВрдб рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:
- рд░реЗрдбрд┐рд╕
- рдЬреНрдЮрд╛рдкрди
- MySQL
- PostgreSQL
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
RabbitMQ рдФрд░
ZeroMQ ред
рдпрд╣ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡реИрд╕реЗ рднреА, php-fpm рд╕реЗ рддреЗрдЬ))
рддрд╛рд░реНрдХрд┐рдХ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐, C рдореЗрдВ рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдП? LUA рдкрд░ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдФрд░ рддреЗрдЬрд╝ рд╣реИред рдФрд░ рд╣рдо рддреБрд░рдВрдд рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдирдЧреНрдиреЗрдХреНрд╕ рдЗрд╡реЗрдВрдЯ рд▓реВрдк рд╕реЗ рдЬреБрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдмрдЦреНрд╢рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдгред рд╡рд┐рдЪрд╛рд░реЛрдВ
рд╣рдо, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдХреЗрд╡рд▓ рдореБрдЦреНрдп рднрд╛рдЧреЛрдВ рдХреЛ рдкреВрд░реНрдг рдХреЛрдб рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЗрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдкрд╣рд▓реЗ php рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
1. рдЗрд╕ рднрд╛рдЧ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдФрд░ рдирд┐рд░реНрдорд╛рдг рд╣рдорд╛рд░реЗ рд╕рд╣рдпреЛрдЧреА
AOTD рдиреЗ рдХрд┐рдпрд╛ рдерд╛ред рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рднрдВрдбрд╛рд░ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХреБрдЫ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдХрд╛рд░ред рд╣рдо ceph рдореЗрдВ рдЪрд┐рддреНрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ Amazon S3 рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред ImageMagick рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреБрдирд░реНрд╡рд┐рдХреНрд░реЗрддрд╛ рдкрд░ рдПрдХ рдХреИрд╢ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ, рд╕рдВрд╕рд╛рдзрд┐рдд рдЪрд┐рддреНрд░ рд╡рд╣рд╛рдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред
рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЪрд┐рддреНрд░, рдЙрд╕ рд╕рдВрдХрд▓реНрдк рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕реЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕реАрдл рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ рдордХреНрдЦреА рдкрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред
serve_image.lua
require "config" local function return_not_found(msg) ngx.status = ngx.HTTP_NOT_FOUND if msg then ngx.header["X-Message"] = msg end ngx.exit(0) end local name, size, ext = ngx.var.name, ngx.var.size, ngx.var.ext if not size or size == '' then return_not_found() end if not image_scales[size] then return_not_found('Unexpected image scale') end local cache_dir = static_storage_path .. '/' .. ngx.var.first .. '/' .. ngx.var.second .. '/' local original_fname = cache_dir .. name .. ext local dest_fname = cache_dir .. name .. size .. ext
рд╣рдо рдХрд╛рд▓реНрдкрдирд┐рдХ.рд▓реБрдЖ
рдмрдВрдзрди рдХреЛ рдЬреЛрдбрд╝рддреЗ
рд╣реИрдВ ред рд╕реБрд▓рдн
LJJIT рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
nginx_partial_resizer.conf.template
2. рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдпрд░рд╡реЙрд▓ред рд╕рддреНрдпрд╛рдкрди, рдЧреНрд░рд╛рд╣рдХ рдкрд╣рдЪрд╛рди, рдЖрд░рдкреАрдПрд╕ рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рдЙрди рдЕрд╡рд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
Firewall.lua
module(..., package.seeall); local function ban(type, element) CStorage.banPermanent:set(type .. '__' .. element, 1); ngx.location.capture('/postgres_ban', { ['vars'] = { ['type'] = type, ['value'] = element} }); end local function checkBanned(apiKey)
Validator.lua
module(..., package.seeall); local function checkApiVersion() local apiVersion = ''; if not (ngx.ctx.REQUEST['version']) then local nginx_request = tostring(ngx.var.uri); local version = nginx_request:sub(2,4); if tonumber(version:sub(1,1)) and tonumber(version:sub(3,3)) then apiVersion = version; else return CApiException.throw('versionIsRequired'); end; else apiVersion = ngx.ctx.REQUEST['version']; end; local isSupported = false; for i, version in pairs(config.app_params['supported_api_version']) do if apiVersion == version then isSupported = true; end; end; if not (isSupported) then CApiException.throw('unsupportedVersion'); end; ngx.ctx.GLOBAL['api_version'] = apiVersion; end; local function checkKey() if not (ngx.ctx.REQUEST['key']) then CApiException.throw('unauthorized'); end; end; function run() checkApiVersion(); checkKey(); end;
Apikey.lua
module ( ..., package.seeall ) function init() if not(ngx.ctx.GLOBAL['CApiKey']) then ngx.ctx.GLOBAL['CApiKey'] = {}; end end; function flush() CStorage.apiKey:flush_all(); CStorage.apiKey:flush_expired(); end; function load() local dbError = nil; local dbData = ngx.location.capture('/postgres_get_keys'); dbData = dbData.body; dbData, dbError = rdsParser.parse(dbData); if dbData ~= nil then local rows = dbData.resultset if rows then for i, row in ipairs(rows) do local cacheKeyData = {}; for col, val in pairs(row) do if val ~= rdsParser.null then cacheKeyData[col] = val; else cacheKeyData[col] = nil; end end CStorage.apiKey:set(tostring(cacheKeyData['key']),JSON:encode(cacheKeyData)); end; end; end; end; function checkNotEmpty() if not(ngx.ctx.GLOBAL['CApiKey']['loaded']) then local cnt = CHelper.tablelength(CStorage.apiKey:get_keys(1)); if cnt == 0 then load(); end; ngx.ctx.GLOBAL['CApiKey']['loaded'] = 1; end; end; function getData(key) checkNotEmpty(); return CStorage.apiKey:get(key); end; function getStatus(key) key = getData(key); local result = ''; if key ~= nil then key = JSON:decode(key); if key['is_active'] ~= nil and key['is_active'] == true then result = 'allowed'; else result = 'blocked'; end; else result = 'forbidden'; end; return result; end; function blockTemporary(apiKey) apiKey = tostring(apiKey); local isset = getData(apiKey); if isset then CStorage.tmpBlockedDemoKeys:set(apiKey, 1, config.app_params['ban_params']['time_demo_apikey_block_tmp']); end; end; function block(apiKey) apiKey = tostring(apiKey); local keyData = getData(apiKey); if keyData then ngx.location.capture('/redis_get', { ['vars'] = { ['key'] = apiKey } }); keyData['is_active'] = false; CStorage.apiKey:set(apiKey,JSON:encode(cacheKeyData)); end; end;
Storages.lua
module ( ..., package.seeall ) apiKey = ngx.shared.apiKey; RPS = ngx.shared.RPS; RPP = ngx.shared.RPP; banPermanent = ngx.shared.banPermanent; banTmp = ngx.shared.banTmp; tmpBlockedDemoKeys = ngx.shared.tmpBlockedDemoKeys;
3. рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрд╡рд╛рдПрдВ, рдЬреИрд╕реЗ рдХрд┐ рдПрдПрдордХреНрдпреВрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдВрддрд░-рдШрдЯрдХ рд╕рдВрдЪрд╛рд░ред рдПрдХ рдЙрджрд╛рд╣рд░рдг
рдпрд╣рд╛рдБ рд╣реИ ред
4. рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ
рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдерд╛ ред "рд╕реНрдорд╛рд░реНрдЯрд▓реА" рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЖрд╡реЗрджрди рдЖрддреНрдо рдирд┐рджрд╛рди рдореЙрдбреНрдпреВрд▓ рдмреИрдХрдПрдВрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрднреА рднреА рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╣реИред
5. рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдбреЗрдкреНрдЯрд░ред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореМрдЬреВрджрд╛ рддрд░реАрдХреЛрдВ рдХреЛ рдмрджрд▓рдирд╛, рдкреВрд░рдХ рдХрд░рдирд╛ рдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ,
рдПрд▓рдпреВрдП рдорджрдж рдХрд░реЗрдЧрд╛ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдбрд╝рд╛рди рдкрд░ json <-> xml рд░реВрдкрд╛рдВрддрд░рдгред
6 ... рдХрдИ рдФрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВред
рдЗрд╕ рддрд░рд╣ рдХреЛрдИ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЙрддреНрдкрд╛рдж рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИрдВ рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рдмрд╛рдж рдЖрд░рдкреАрдПрд╕ рдХрдИ рдХрд╛рд░рдХреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ 20 рдЧреБрдирд╛ рд╡реГрджреНрдзрд┐ рд╣рд╛рд╕рд┐рд▓ рдХреА рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдм рдХреБрдЫ ~ 200 рдЧреБрдирд╛ рддрдХ рддреЗрдЬ рд╣реЛ рдЧрдпрд╛ред
рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖
рдореВрд░реНрдд рдкреНрд▓рд╕рд╕ред рд╕рдм рдХреБрдЫ рдЬреЛ php рдореЗрдВ 5 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдХрд╛ рдХреЛрдб рд╣реБрдЖ рдХрд░рддрд╛ рдерд╛, рд╡рд╣ рд▓реБрдЖ рдореЗрдВ 100kb рдлрд╛рдЗрд▓ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
- рд╡рд┐рдХрд╛рд╕ рдХреА рдЧрддрд┐,
- рдЖрд╡реЗрджрди рдХреА рдЧрддрд┐
- рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛
- рдЧреНрд░рд╛рд╣рдХреЛрдВ рдФрд░ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдирдЧрд┐рдирдХреНрд╕ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рддреЗ рд╣реИрдВ,
- рд▓реВ рд╢реБрдЧрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ! Coroutines, рд╕рднреА nginx рдХрд╛рдВрдЯреЗ, рдЙрдк-quests, рдмрд╛рдБрдзрдиреЗ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рд╢рдмреНрджрдХреЛрд╢ред
рдЕрдЧреЛрдЪрд░ рд╡рд┐рдкрдХреНрд╖ред
- рдЖрдкрдХреЛ рд╕рдм рдХреБрдЫ рдзреНрдпрд╛рди рд╕реЗ рдХрд░рдиреЗ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдФрд░ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдирдЧреНрдиреЗрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
- рдлреНрд░рдВрдЯреЗрдВрдб рдЗрддрдирд╛ рддреЗрдЬ рд╣реИ рдХрд┐ рдмреИрдХреЗрдВрдб рдЗрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкрд░рддреЛрдВ рдХреЗ рдмрд┐рдирд╛, рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рд╕реАрдзрд╛ рд╕рдВрдмрдВрдз рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╕реАрдорд╛ рдкрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб LUA рдХреЗ 10,000 рдЕрдиреБрд░реЛрдз рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдпрд╣ рдЖрдзрд╛рд░ рдкрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
- рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖ рддреЛ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
рд╡реИрд╕реЗ, рдЬрдм рдпрд╣ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдареАрдХ рдЙрд╕реА рд╕рдордп рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░
рдиреЗ рдЗрд╕ рд╕рдм
рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХреАред
рд╣рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
рдЕрдВрдд рдореЗрдВ,
рдпрд╣рд╛рдВ рдЖрдк рд╡рд┐рд╖рдп рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛
рдПрдХ рдЫреЛрдЯрд╛ рдЪрдпрди
рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред