Nginx 通过 $request_time 变量记录请求总耗时(秒,精度毫秒),需在 log_format 中定义并配合 access_log 使用;其值在请求结束时生成,不可用于条件判断,且包含网络、排队等全部延迟,非纯后端处理时间。

在 Nginx 中,可以通过 $request_time 变量将请求的处理响应时间(单位:秒,精度为毫秒)写入自定义日志。
配置自定义日志格式并引用 $request_time
在 http 块中定义日志格式,加入 $request_time 变量:
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:从读取客户端请求头开始,到把响应发送给客户端结束的总耗时(含 Nginx 内部处理、代理等待、后端响应等),单位为秒,保留三位小数(如0.024)。 -
$upstream_response_time(可选):仅记录与 upstream(如 FastCGI、proxy_pass 后端)交互的耗时,多个值用逗号分隔,适用于调试后端性能。
在 server 或 location 块中启用该日志
指定使用刚定义的日志格式,并设置日志路径:
access_log /var/log/nginx/access.log main;
若需按不同 location 区分日志,也可单独配置:
location /api/ {
access_log /var/log/nginx/api_access.log main;
}注意精度和时序细节
$request_time 是 Nginx 在请求结束时才计算完成的变量,因此不能用于条件日志(如 if 判断或 log_if 模块),也不能在请求中途记录。常见误区:
- 它不等于后端实际处理时间,而是整个 Nginx 请求生命周期(含网络延迟、排队、缓冲等)。
- 如果启用了缓存且命中,
$request_time通常极短;若涉及 proxy_pass,建议同时记录$upstream_response_time对比分析。 - 日志中显示为
0.000一般表示请求极快(
验证是否生效
重启 Nginx 后发起请求,检查日志输出是否包含时间字段:
192.168.1.100 - - [10/Jul/2024:14:22:33 +0800] "GET /health HTTP/1.1" 200 2 "–" "curl/7.68.0" 0.002 0.001
最后两列即为 $request_time 和 $upstream_response_time。


















