21 мая 2019 г.

Ограничение скорости отдачи файла nginx'ом

Иногда хочется ограничить скорость отдачи файла. Ну, например, если вы раздаёте видеоролики, то имеет смысл выставлять максимум скорости отдачи файла в зависимости от его битрейта. Оказывается, это можно сделать на стандартном 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 в этом примере — просто заглушка, т.к. он даже не пытается анализировать, на какой файл устанавливать ограничения.