准确记录 API 响应大小应使用 $body_bytes_sent,因其仅统计响应体字节数,排除响应头干扰,适合监控 JSON 等数据量;需在 log_format 中显式定义并配合 location /api/ 配置 access_log 使用。

要准确记录 API 请求的响应大小,关键不是“开启 access_log”,而是确保日志格式中包含能反映响应体字节数的变量——最常用、最可靠的是 $body_bytes_sent。
为什么用 $body_bytes_sent 而不是 $bytes_sent
$body_bytes_sent 只统计 HTTP 响应体(即实际返回给客户端的数据内容)的字节数,不包括响应头。这对监控 API 返回数据量非常实用,比如判断接口是否返回了过大的 JSON 或未压缩的资源。
$bytes_sent 则包含响应头 + 响应体的总大小,受 Header 字段数量、长度(如长 Cookie、自定义 Header)影响较大,波动大,不适合做响应体大小的基准指标。
所以记录 API 响应大小,应优先选用 $body_bytes_sent。
在 log_format 中显式加入响应大小字段
需在 http{} 块中定义或修改日志格式,例如:
log_format api_log '[$time_iso8601] $remote_addr "$request" $status $body_bytes_sent "$http_user_agent"';
说明:
对设计或页面进行 WCAG 2.1 AA 无障碍审计。触发关键词:“audit accessibility”、 “check a11y”、 “is this accessible?” 或在审查设计时使用。
-
$time_iso8601:标准 ISO 时间格式,便于日志分析工具识别 -
$remote_addr:客户端真实 IP(若在代理后,建议改用$http_x_forwarded_for并做好可信源校验) -
"$request":完整请求行,含方法、URI、协议,方便定位具体 API -
$status:HTTP 状态码,配合响应大小可快速发现 200 但返回空/超大体等异常 -
$body_bytes_sent:核心字段,即你要的响应体大小(单位:字节)
在 server 或 location 中启用该日志格式
针对 API 接口路径(如 /api/),推荐在 location 块中单独配置,避免污染静态资源日志:
location /api/ {
access_log /var/log/nginx/api_access.log api_log;
# 其他 proxy_pass 或处理逻辑...
}
这样只有匹配 /api/ 的请求才会写入 api_access.log,且使用你定义的 api_log 格式,响应大小一目了然。
注意几个常见误区
• $request_body 不等于响应大小:它是请求体(如 POST 数据),默认不记录,且需额外配置(如 client_body_buffer_size)和权限支持,与响应无关。
• 响应大小为 0 不一定失败:204 No Content、304 Not Modified 等合法响应本就不含响应体,此时 $body_bytes_sent 就是 0,属正常现象。
• gzip 压缩不影响 $body_bytes_sent:该变量记录的是**发送前已压缩的响应体字节数**,也就是客户端实际接收到的 body 大小,无需额外换算。

















