怎么在四层 Stream 转发日志中利用 $upstream_bytes_received 统计后端数据库集群的下行流量

老丽姑娘_2296

老丽姑娘_2296

2026-06-24

546人浏览

原创

$upstream_bytes_received 在 stream 模块中不可用,因其仅存在于 http 模块;stream 模块应使用 $bytes_sent 统计后端返回客户端的下行流量,配合 $bytes_received 获取上行数据,二者共同构成四层代理流量监控基础。

怎么在四层 stream 转发日志中利用 $upstream_bytes_received 统计后端数据库集群的下行流量

在四层(L4)Stream 模块中,$upstream_bytes_received 并不可用 —— 这是关键前提。它仅存在于 HTTP 模块的 upstream 变量中,而 Stream 模块不支持该变量,也不解析应用层协议,因此无法直接获取后端返回的字节数。

为什么 $upstream_bytes_received 在 Stream 中无效

NGINX Stream 模块工作在 TCP/UDP 层,不解析内容,不维护 HTTP 语义,所有 upstream 变量如 $upstream_bytes_received、$upstream_response_time 等均未定义。尝试使用会导致空值或启动报错(如 “unknown variable”)。

若配置中出现:

log_format stream_log "bytes_up: $bytes_sent bytes_down: $upstream_bytes_received";

其中 $upstream_bytes_received 始终为空或 0,无法用于统计数据库下行流量。

替代方案:用 $bytes_received 统计客户端发给 NGINX 的数据量

Stream 模块提供真实可用的变量:

Nginx Config Linter
Nginx Config Linter

对 Nginx 配置文件进行语法检查、验证和安全、性能审计。

下载
  • $bytes_received:客户端发送到 NGINX 的字节数(即“上行”,含 SQL 请求等)
  • $bytes_sent:NGINX 发送给客户端的字节数(即“下行”,含查询结果集)

对数据库集群而言,$bytes_sent 就是你能可靠获取的“下行流量”近似值——它代表从后端数据库经 NGINX 返回给客户端的数据总量,正是你要统计的目标。

示例日志格式:

log_format db_stream 'time:$time_iso8601 client:$remote_addr db:$upstream_addr sent:$bytes_sent received:$bytes_received';

精确统计后端真实下行流量的进阶方法

若需严格区分“NGINX→客户端”与“后端→NGINX”的字节(例如排除 NGINX 自身开销或做 per-backend 聚合),需借助外部工具或改造链路:

  • TCP 抓包 + 流量标记:在数据库服务器出口抓包(如 tcpdump -i eth0 port 3306 -w db_out.pcap),用 tshark 过滤并统计 server→proxy 方向的 payload 字节数
  • 数据库侧主动上报:MySQL 可开启 performance_schema 或使用慢日志 + Rows_examined/Bytes_sent;PostgreSQL 启用 log_line_prefix 加 %b(backend start time)配合自定义日志解析
  • 旁路镜像 + 流量分析系统:将 Stream 的 upstream 流量镜像到流量分析器(如 Zeek/Bro、nfdump),按连接五元组聚合后端响应字节数

注意事项与常见误判

避免把 $bytes_sent 当作后端网卡出向流量的完全等价——它包含 NGINX 内部缓冲、TLS 开销(若启用了 ssl_preread)、以及可能的协议封装字节(如 MySQL 协议头)。实际偏差通常

另外注意:

  • Stream 日志默认只在连接关闭时写入,若需实时性,启用 flush=1s
  • 确保 log_format 定义在 stream{} 块内,且 access_log 指向有效路径
  • 数据库长连接会延迟日志输出,统计周期建议以分钟级聚合,而非单次请求

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2223

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5910

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5206

10

nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

383

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3187

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

5845

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

561

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1476

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3938

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习