stats: Это статистический модуль для nginx, основанный на nginx-module-lua. Статистические ключи и значения настраиваемы, могут использовать переменные ядра nginx и переменные этого модуля. Статистические результаты хранятся в mongodb.
Установка
Если вы еще не настроили подписку на RPM-репозиторий, зарегистрируйтесь. Затем вы можете продолжить с следующими шагами.
CentOS/RHEL 7 или Amazon Linux 2
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-stats
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-stats
Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что nginx-module-lua установлен.
Этот документ описывает lua-resty-stats v1.0.3, выпущенную 28 ноября 2020 года.
#установите переменную окружения ngx_lua:
# инициализируйте lua-resty-stats
init_worker_by_lua '
local stats = require("resty.stats")
-- добавьте стандартные статистики с именем "stats_host"
stats.add_def_stats()
-- общая конфигурация статистики
local update = {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1,
["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}}
-- статистика по uri
stats.add_stats_config("stats_uri",
{selector={date="$date",key="$uri"}, update=update,
indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })
-- статистика по аргументу
stats.add_stats_config("stats_arg",
{selector={date="$date",key="$arg_client_type"}, update=update,
indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })
-- статистика по uri и аргументам
stats.add_stats_config("stats_uri_arg",
{selector={date="$date",key="$uri?$arg_from"}, update=update,
indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })
-- статистика по заголовку http-запроса
stats.add_stats_config("stats_header_in",
{selector={date="$date",key="city:$http_city"}, update=update,
indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })
-- статистика по заголовку http-ответа
stats.add_stats_config("stats_header_out",
{selector={date="$date",key="cache:$sent_http_cache"}, update=update,
indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })
local mongo_cfg = {host="192.168.1.201", port=27017, dbname="ngx_stats"}
local flush_interval = 2 -- секунды
local retry_interval = 0.2 -- секунды
-- инициализируйте статистику и запустите таймер сброса.
stats.init(mongo_cfg, flush_interval, retry_interval)
';
server {
listen 80;
server_name localhost;
location /byuri {
echo "byuri: $uri";
log_by_lua '
local stats = require("resty.stats")
stats.log("stats_uri")
stats.log("stats_host")
';
}
location /byarg {
echo_sleep 0.005;
echo "login $args";
log_by_lua '
local stats = require("resty.stats")
stats.log("stats_arg")
';
}
location /byarg/404 {
request_stats statby_arg "clitype:$arg_client_type";
return 404;
log_by_lua '
local stats = require("resty.stats")
stats.log("stats_arg")
';
}
location /byuriarg {
echo "$uri?$args";
log_by_lua '
local stats = require("resty.stats")
stats.log("stats_uri_arg")
';
}
location /byhttpheaderin {
echo "city: $http_city";
log_by_lua '
local stats = require("resty.stats")
stats.log("stats_header_in")
';
}
location /byhttpheaderout/ {
proxy_pass http://127.0.0.1:82;
log_by_lua '
local stats = require("resty.stats")
stats.log("stats_header_out")
';
}
}
server {
listen 82;
server_name localhost;
location /byhttpheaderout/hit {
add_header cache hit;
echo "cache: hit";
}
location /byhttpheaderout/miss {
add_header cache miss;
echo "cache: miss";
}
}
server {
listen 2000;
server_name localhost;
location /stats {
set $template_root /path/to/lua-resty-stats/view;
content_by_lua_file '/path/to/lua-resty-stats/view/main.lua';
}
}
Переменные
- Модуль nginx_core поддерживает переменные: http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
- Переменные этого модуля
- date: текущая дата в формате: 1970-09-28
- time: текущее время в формате: 12:00:00
- year: текущий год
- month: текущий месяц
- day: текущая дата
- hour: текущий час
- minute: текущая минута
- second: текущая секунда
Методы
Чтобы загрузить эту библиотеку,
вам нужно указать путь к этой библиотеке в директиве lua_package_path ngx_lua. Например:
http {
}
вы используете require для загрузки библиотеки в локальную переменную Lua:
local stats = require("resty.stats")
add_def_stats
синтаксис: stats.add_def_stats()
добавляет предопределенные конфигурации статистики, которые содержат:
stats_name: stats_host
stats_config:
{
selector={date='$date',key='$host'},
update={['$inc']= {count=1, ['hour_cnt.$hour']=1, ['status.$status']=1,
['req_time.all']="$request_time", ['req_time.$hour']="$request_time"}},
indexes={
{keys={'date', 'key'}, options={unique=true}},
{keys={'key'}, options={}}
},
}
}
add_stats_config
синтаксис: stats.add_stats_config(stats_name, stats_config)
Добавляет элемент пользовательской статистической конфигурации, который содержит stats_name и конфигурацию статистики.
* stats_name — это имя статистики, а также имя таблицы mongodb.
Имя будет использоваться при вызове метода stats.log(stats_name).
* stats_config используется для определения значений статистики.
stats_config — это таблица, которая содержит некоторые поля:
* selector — это оператор запроса mongodb. например: {date="$date",key="$host"}
* update — это оператор обновления mongodb. например: {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1,
["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}}
* indexes — это таблица, которая содержит все поля индекса.
Конфигурации selector и update могут использовать переменные.
Обратите внимание, что "$inc" не является переменной nginx, это оператор mongodb.
init
синтаксис: stats.init(mongo_cfg, flush_interval, retry_interval)
Инициализация статистической библиотеки.
* mongo_cfg Конфигурация mongodb, содержит поля:
* host хост mongodb
* port порт mongodb
* dbname имя базы данных mongodb.
* flush_interval интервал времени для сброса данных в mongodb, единица времени — секунды.
* retry_interval интервал времени повторной попытки при ошибке сброса, единица времени — секунды.
log
синтаксис: stats.log(stats_name)
Собирает указанную (по stats_name) статистическую информацию на этапе логирования.
* stats_name — это одно статистическое имя, добавленное с помощью stats.add_stats_config.
Если stats_name равно nil, метод логирования соберет всю статистику, которая была настроена.
Простой запрос и API
lua-resty-stats имеет простую страницу запроса и интерфейс API, которые можно использовать в следующих шагах: * добавьте конфигурацию location в nginx.conf
location /stats {
set $template_root /path/to/lua-resty-stats/view;
content_by_lua_file '/path/to/lua-resty-stats/view/main.lua';
}
- Доступ к странице запроса. например,
http://192.168.1.xxx/stats:

- Доступ к API:
## по дате
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=2020-02-20&limit=100
## по дате, сегодня
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=today&limit=10
## по ключу (параметр даты игнорируется)
curl http://127.0.0.1:8020/stats/api?table=stats_uri&key=/path/to/uri
- Ответ API будет выглядеть примерно так:
{
"stats": [
{
"hour_cnt": {
"19": 24
},
"count": 24,
"status": {
"200": 24
},
"total": 24,
"req_time": {
"19": 13.262,
"all": 13.262
},
"percent": 100,
"key": "/path/to/uri",
"date": "2020-09-24"
}
]
}
Если вы настроили какие-либо другие поля в вашем обновлении, это будет отличаться
Простой демонстрационный пример
Простой демонстрационный пример статистики
Вы можете включить его в nginx.conf, используя директиву include. Например:
include /path/to/simple_stats.conf;
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-stats.