Nginx 使用 $request_time 变量记录请求总耗时(单位秒,精度毫秒),需配合自定义 log_format 输出;它包含请求体接收、后端处理及响应发送全过程,不等同于 $upstream_response_time。

在 Nginx 中,要记录请求的响应耗时(即从接收到完整请求头开始,到把响应全部发送给客户端结束的时间),需使用内置变量 $request_time,并配合自定义 log_format 实现。
启用 request_time 变量输出
$request_time 是 Nginx 的标准变量,单位为秒,精度为毫秒(如 0.032 表示 32 毫秒),无需额外模块,只要 Nginx 版本 ≥ 0.7.62 即可直接使用。
- 该值包含接收请求体时间(若存在)、后端处理(如 proxy_pass)和发送响应的总耗时
- 注意它不等于
$upstream_response_time(后者只统计上游服务返回首字节的时间) - 若启用了请求体读取延迟(如
client_body_timeout),这部分也会被计入$request_time
定义带耗时的 log_format
在 http 块中定义格式,例如:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';-
$request_time放在最后,便于日志解析(也可按需调整位置) - 建议同时保留
$upstream_response_time,便于对比 Nginx 自身开销与后端响应延迟 - 若需更高精度(微秒级),Nginx 1.19.5+ 支持
$msec和$request_completion组合计算,但通常$request_time已足够
在 server 或 location 中启用该格式
指定 access_log 使用刚定义的格式:
access_log /var/log/nginx/access.log main;
- 确保日志路径有写入权限,且磁盘空间充足(高并发下耗时字段会略微增大日志体积)
- 如只需对特定接口记录耗时,可在对应
location块内单独配置access_log - 调试时可临时加
log_not_found off;避免 404 日志干扰耗时分析
验证与常见问题
重启 Nginx 后发起请求,查看日志是否出现数值:
192.168.1.100 - - [10/Jan/2025:14:22:33 +0800] "GET /api/user HTTP/1.1" 200 1245 "-" "curl/8.5.0" 0.042 0.039
- 若
$request_time恒为0.000,检查是否误用了$time_local等静态变量替代,或 Nginx 版本过低 - 若所有请求耗时都偏大(如 >1s),可能是客户端网络慢、Nginx 限速(
limit_rate)、或日志写入阻塞(可改用buffer和flush优化) - 注意:keepalive 连接上的多个请求,
$request_time记录的是单次请求耗时,不是连接总时长


















