Иногда хочется ограничить скорость отдачи файла. Ну, например, если вы раздаёте видеоролики, то имеет смысл выставлять максимум скорости отдачи файла в зависимости от его битрейта. Оказывается, это можно сделать на стандартном nginx (не Plus) через Lua-модуль:
location / { # или какой нужен, например, по маске имени
set $drate '';
set_by_lua_file $sum /var/www/html/datarate.lua;
set $limit_rate $drate;
}
# datarate.lua просто вызывает внешний скрипт и сохраняет его выдачу в переменную
function os.capture(cmd, raw)
local f = assert(io.popen(cmd, 'r'))
local s = assert(f:read('*a'))
f:close()
if raw then return s end
s = string.gsub(s, '^%s+', '')
s = string.gsub(s, '%s+$', '')
s = string.gsub(s, '[\n\r]+', ' ')
return s
end
local curPercent = os.capture ("/usr/local/bin/getnum", false)
print (curPercent)
ngx.var.drate = curPercent
getnum:
#!/bin/bash
echo -n 50k
Очевидно, что getnum в этом примере — просто заглушка, т.к. он даже не пытается анализировать, на какой файл устанавливать ограничения.
location / { # или какой нужен, например, по маске имени
set $drate '';
set_by_lua_file $sum /var/www/html/datarate.lua;
set $limit_rate $drate;
}
# datarate.lua просто вызывает внешний скрипт и сохраняет его выдачу в переменную
function os.capture(cmd, raw)
local f = assert(io.popen(cmd, 'r'))
local s = assert(f:read('*a'))
f:close()
if raw then return s end
s = string.gsub(s, '^%s+', '')
s = string.gsub(s, '%s+$', '')
s = string.gsub(s, '[\n\r]+', ' ')
return s
end
local curPercent = os.capture ("/usr/local/bin/getnum", false)
print (curPercent)
ngx.var.drate = curPercent
getnum:
#!/bin/bash
echo -n 50k
Очевидно, что getnum в этом примере — просто заглушка, т.к. он даже не пытается анализировать, на какой файл устанавливать ограничения.