stats: Est un module statistique pour nginx basé sur nginx-module-lua. Les clés et valeurs statistiques sont configurables, peuvent utiliser les variables du noyau nginx et les variables de ce module. Le résultat statistique est stocké dans mongodb.
Installation
Si vous n'avez pas configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.
CentOS/RHEL 7 ou 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
Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.
Ce document décrit lua-resty-stats v1.0.3 publié le 28 novembre 2020.
#set ngx_lua's environment variable:
# init the lua-resty-stats
init_worker_by_lua '
local stats = require("resty.stats")
-- add the default stats that named "stats_host"
stats.add_def_stats()
-- the general stats"s config
local update = {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1,
["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}}
-- stats by 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 by arg
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={}}} })
-- stats by uri and args
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={}}} })
-- stats by http request header
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={}}} })
-- stats by http response header
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 -- seconde
local retry_interval = 0.2 -- seconde
-- init stats and start flush timer.
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';
}
}
Variables
- Le module nginx_core prend en charge la variable : http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
- Variables de ce module
- date : date actuelle au format : 1970-09-28
- time : heure actuelle au format : 12:00:00
- year : année actuelle
- month : mois actuel
- day : date actuelle
- hour : heure actuelle
- minute : minute actuelle
- second : seconde actuelle
Méthodes
Pour charger cette bibliothèque,
vous devez spécifier le chemin de cette bibliothèque dans la directive lua_package_path de ngx_lua. Par exemple :
http {
}
vous utilisez require pour charger la bibliothèque dans une variable Lua locale :
local stats = require("resty.stats")
add_def_stats
syntax: stats.add_def_stats()
ajoute les configurations statistiques prédéfinies qui contiennent :
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
syntax: stats.add_stats_config(stats_name, stats_config)
Ajoute un élément de configuration statistique personnalisé qui contient stats_name et stats config.
* stats_name est le nom des statistiques, et c'est aussi le nom de la table mongodb.
Le nom sera utilisé lors de l'appel de la méthode stats.log(stats_name).
* stats_config est utilisé pour définir les valeurs des statistiques.
stats_config est une table qui contient certains champs :
* selector une instruction de requête mongodb. comme : {date="$date",key="$host"}
* update une instruction de mise à jour mongodb. comme : {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1,
["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}}
* indexes une table qui contient tous les champs de l'index.
La configuration selector et update peut utiliser variables.
Notez que "$inc" n'est pas une variable nginx, c'est un opérateur mongodb.
init
syntax: stats.init(mongo_cfg, flush_interval, retry_interval)
Initialisation de la bibliothèque statistique.
* mongo_cfg La configuration mongodb, contient les champs :
* host hôte mongodb
* port port mongodb
* dbname nom de la base de données mongodb.
* flush_interval intervalle de temps pour vider les données dans mongodb, l'unité de temps est en secondes.
* retry_interval l'intervalle de temps de nouvelle tentative en cas d'erreur de vidage, l'unité de temps est en secondes.
log
syntax: stats.log(stats_name)
Collecte les informations statistiques spécifiées (par stats_name) à la phase de journalisation.
* stats_name est un nom statistique ajouté par stats.add_stats_config.
Si le stats_name est nil, la méthode log collectera toutes les statistiques qui ont été configurées.
Requête Simple Et API
lua-resty-stats avec une page de requête simple et une interface API, qui peut être utilisée dans les étapes suivantes : * ajouter la configuration de localisation à 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';
}
- Accéder à la page de requête. par exemple
http://192.168.1.xxx/stats:

- Accéder à l'API :
## par date
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=2020-02-20&limit=100
## par date, aujourd'hui
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=today&limit=10
## par clé (le paramètre date est ignoré.)
curl http://127.0.0.1:8020/stats/api?table=stats_uri&key=/path/to/uri
- La réponse de l'API ressemblera à quelque chose comme ceci :
{
"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"
}
]
}
Si vous avez configuré d'autres champs dans votre mise à jour, cela sera différent
Démo Simple
Vous pouvez l'inclure dans nginx.conf en utilisant la directive include. Par exemple :
include /path/to/simple_stats.conf;
GitHub
Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-stats.