traffic-accounting: 实时监控 NGINX 的进出流量指标
安装
您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:
- RedHat Enterprise Linux 7、8、9 和 10
- CentOS 7、8、9
- AlmaLinux 8、9
- Rocky Linux 8、9
- Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-traffic-accounting
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 nginx-module-traffic-accounting
通过在 /etc/nginx/nginx.conf 顶部添加以下内容来启用该模块:
load_module modules/ngx_http_accounting_module.so;
本文档描述了 nginx-module-traffic-accounting v2.0.4,于 2022 年 5 月 16 日发布。
实时监控 NGINX 的进出流量指标。
这是一个实时流量和状态码监控解决方案,相比其他实时日志分析解决方案,它需要更少的内存和 CPU。 对于基于 NGINX 配置逻辑(按位置 / 服务器 / 用户定义变量)的流量计量非常有用。
为什么?
实时日志分析解决方案需要多台机器进行存储和分析,对于应用监控来说过于繁重。
需要一种经济高效的解决方案来监控应用请求的流量指标/状态。 该解决方案应准确、灵敏、稳健、足够轻量,并且不受流量高峰的影响。
它是如何工作的?
该模块在其上下文中保持一个由 accounting_id 标识的 metrics 列表。
当新的 request 访问服务器时,模块将尝试找到其 accounting_id,计算统计数据,并将其 aggregate 到相应的 metrics 中。
对于每个时间段(由 interval 定义),会触发一个定时器事件,这些 metrics 会被轮换并导出到日志文件或发送到远程日志服务器。
仪表盘
仪表盘 - 使用 Grafana 可视化

配置
编辑您的 nginx.conf。
示例:
http {
# 开启计量功能
accounting on;
accounting_log logs/http-accounting.log;
...
server {
server_name example.com;
accounting_id $http_host; # 通过变量设置 accounting_id 字符串
location / {
accounting_id accounting_id_str; # 通过位置设置 accounting_id 字符串
...
}
location /api {
accounting_id API_PC; # 针对 PC
if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
accounting_id API_MOBILE; # 针对移动设备
}
...
}
}
}
指令
accounting
语法: accounting on | off
默认: accounting off
上下文: http
accounting_log
语法: accounting_log \ [level]
默认: -
上下文: http
配置日志记录。
支持本地 file 路径,或 stderr,或 syslog:。
第二个参数是日志级别。
有关支持参数的更多详细信息,请参阅 nginx.org 的此页面。
如果未指定,计量日志将写入 /dev/log。
accounting_id
语法: accounting_id \
默认: accounting_id default
上下文: http, server, location, if in location
通过用户定义变量设置 accounting_id 字符串。
该字符串用于确定请求/会话应聚合到哪个 metrics。
accounting_interval
语法: accounting_interval \
默认: accounting_interval 60
上下文: http
指定报告间隔。默认值为 60 秒。
accounting_perturb
语法: accounting_perturb on | off
默认: accounting_perturb off
上下文: http
随机将报告间隔从通常时间延迟 20%。
使用
此模块可以配置为将 metrics 写入本地文件、远程日志服务器或本地 syslog 设备。
开源日志聚合软件如 logstash 也支持 syslog 输入,这将帮助您建立一个中央日志服务器。 请参见 samples/logstash/ 以获取示例。 [推荐]
要使用本地 syslog 收集日志,请参考 Lax/ngx_http_accounting_module-utils 以获取示例配置/工具。
docker / docker-compose
要使用 docker-compose 演示,请运行
docker-compose build
docker-compose up -d
在浏览器中打开 Grafana(地址: http://localhost:3000)。
创建并配置 elasticsearch 数据源,选项如下:
Type: elasticsearch
URL: http://elasticsearch:9200
Version: 5.6+
Min time interval: 1m
然后从 samples/accounting-dashboard-grafana.json 导入计量仪表盘。
Metrics 日志格式
## HTTP
2018/05/14 14:18:18 [notice] 5#0: pid:5|from:1526278638|to:1526278659|accounting_id:HTTP_ECHO_HELLO|requests:4872|bytes_in:438480|bytes_out:730800|latency_ms:0|upstream_latency_ms:0|200:4872
2018/05/14 14:18:18 [notice] 5#0: pid:5|from:1526278638|to:1526278659|accounting_id:INDEX|requests:4849|bytes_in:421863|bytes_out:1857167|latency_ms:0|upstream_latency_ms:0|301:4849
## Stream
2018/05/14 14:18:22 [notice] 5#0: pid:5|from:1526278642|to:1526278659|accounting_id:TCP_PROXY_ECHO|sessions:9723|bytes_in:860343|bytes_out:2587967|latency_ms:4133|upstream_latency_ms:3810|200:9723
日志输出的每一行包含特定 accounting_id 的 metrics,其中包含一系列键值对。
| 键名 | 值的含义 |
|---|---|
pid |
nginx 工作进程的 pid |
from / to |
指标在这两个时间戳之间的 period 被收集 |
accounting_id |
由 accounting_id 指令设置的计量单位标识 |
requests |
当前周期内处理的总请求数(仅适用于 HTTP 模块) |
sessions |
当前周期内处理的总会话数(仅适用于 Stream 模块) |
bytes_in |
服务器接收的总字节数 |
bytes_out |
服务器发送的总字节数 |
latency_ms |
所有请求/会话的 $session_time 之和,以 毫秒 为单位 |
upstream_latency_ms |
$upstream_response_time 的总和,以 毫秒 为单位 |
200 / 302 / 400 / 404 / 500 ... |
状态码为 200/302/400/404/500 等的请求/会话计数。注意 HTTP 代码和流代码之间的差异 |
配置示例
http {
accounting on;
accounting_log logs/http-accounting.log;
accounting_id $hostname;
...
}
stream {
accounting on;
accounting_log logs/stream-accounting.log;
accounting_id $hostname;
...
}
可视化
使用 Kibana 或 Grafana 进行可视化非常简单。
请参见 samples/ 以获取示例。
分支
- master : 主要开发分支。
- tag v0.1 或 v2-freeze-20110526 : 旧版发布。适用于 nginx 版本(0.7.xx, 0.8.xx),未测试 nginx 0.9。与 nginx 1.0.x 以上版本不兼容。
GitHub
您可以在 nginx-module-traffic-accounting 的 GitHub 仓库 中找到此模块的其他配置提示和文档。