You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx中$body_bytes_sent与Content-Length的关系及字节数日志问题

Nginx中$body_bytes_sent与Content-Length的关系及字节数日志问题

嗨,这个问题我刚好有经验,来给你掰扯清楚~

首先明确两个核心变量的含义:

  • $body_bytes_sent:这是Nginx实际成功发送到客户端的响应体字节数。如果客户端中途断开连接、没读完整个响应,这个值就会小于响应头里的Content-Length。
  • $sent_http_content_length:这个变量直接对应响应头里的Content-Length值,也就是Nginx原本应该发送的完整响应体字节数(完全符合你说的“服务器响应始终带Content-Length且非分块传输”的场景)。

所以你想要同时记录“应该发送的字节数”和“实际到达客户端的字节数”,只需要在Nginx的日志格式里同时配置这两个变量就行。

举个具体的配置例子:

  1. 先在nginx.conf的http块里定义一个包含这两个变量的日志格式:
log_format detailed_bytes '$remote_addr - $remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         '"$http_user_agent" "expected_bytes:$sent_http_content_length"';
  1. 然后在你对应的server或者location块里指定使用这个日志格式:
access_log /var/log/nginx/your_site_access.log detailed_bytes;

这样配置后,每条日志里就会同时显示$body_bytes_sent(实际发送字节数)和$sent_http_content_length(预期发送的Content-Length值)。比如客户端正常读完响应时,这两个数值会相等;如果客户端中途断开,$body_bytes_sent就会比$sent_http_content_length小,从日志里一眼就能看出来。

另外补充一句:在你说的“始终带Content-Length且非分块”的场景下,$sent_http_content_length一定会有值;如果是分块传输的情况,这个变量会是空的,但你的场景里不用考虑这个。

备注:内容来源于stack exchange,提问作者deevroman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 12:22:57