Nginx中记录响应体字节数最直接的变量是$body_bytes_sent,它表示HTTP响应体大小(不含响应头),单位字节,内置于log_module,开箱即用,空响应时为0。

在 Nginx 中,记录请求发送给客户端的字节数,最直接、最常用且默认可用的变量是 $body_bytes_sent。它表示响应体(即 HTTP 响应中除去响应头之后的实际内容)的字节数,不包含响应头本身。
核心变量:$body_bytes_sent 是关键
这个变量已内置于 Nginx 的 ngx_http_log_module 模块中,无需额外启用或编译选项,开箱即用:
- 值为整数,单位是字节(byte)
- 对静态文件、代理返回内容、PHP 输出等所有响应都有效
- 若响应为空(如 304、204 或重定向无 body),该值为 0
- 注意:它不等于整个 HTTP 响应总大小(不含响应头),也不含 chunked 编码的传输开销
如何在日志中使用它
只需在 log_format 中加入该变量,并确保 access_log 引用该格式:
http {
log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
<pre class="brush:php;toolbar:false;">server {
access_log /var/log/nginx/access.log custom;
# 其他配置...
}}
重启或重载 Nginx 后,日志中对应字段就会显示实际发出的响应体大小,例如:
192.168.1.100 - - [06/Jul/2026:20:15:22 +0000] "GET /index.html HTTP/1.1" 200 12480 "-" "curl/8.10.1"补充说明:其他相关字节变量的区别
避免混淆,这几个变量用途不同,需按需选用:
-
$bytes_sent:整个响应(含响应头 + 响应体)发送给客户端的总字节数,比
$body_bytes_sent略大,但非标准 HTTP 模块默认变量,需确认是否启用(某些发行版或自定义编译可能未包含) - $request_length:请求行 + 请求头 + 请求体的总长度(单位字节),反映客户端发来的完整请求大小
-
$content_length:仅来自请求头中的
Content-Length字段值,适用于 POST/PUT,但不可靠(如分块传输、客户端伪造时失效) -
$bytes_received:仅在
stream模块中可用,HTTP 模块不支持
验证与调试建议
快速确认是否生效:
- 用
curl -s -o /dev/null -w '%{size_download}\n' http://your-site/查看实际下载字节数,与日志中$body_bytes_sent对比 - 访问一个已知大小的静态文件(如 1KB 的 test.txt),检查日志输出是否匹配
- 查看 Nginx 错误日志,确认无
unknown log variable报错











