$request_time 是 nginx 内置高精度计时器的差值,即从接收请求首字节到发出响应末字节的总耗时(秒级,毫秒精度),由 ngx_gettimeofday() 两次采样相减得出,不依赖外部逻辑,仅在请求完整结束后写入日志。

$request_time 不是“算法计算出来的”,它是 Nginx 内置的高精度计时器差值,本质是两个时间戳相减的结果,不是通过公式或逻辑推导生成的。
它记录的是:
从 Nginx 接收到客户端请求的第一个字节开始,到把响应的最后一个字节发送给客户端并完成写入为止的总耗时(单位:秒,毫秒级精度)。
时间起点和终点严格固定
- ✅ 起点:
ngx_http_log_request_time_handler()中调用ngx_gettimeofday()获取当前时间(即请求头开始被读取的时刻) - ✅ 终点:在
ngx_http_finalize_request()或ngx_http_send_special()完成响应输出后,再次调用ngx_gettimeofday() - ⏱ 差值 = 终点时间 − 起点时间 → 赋值给
$request_time
这个过程由 Nginx 核心模块自动完成,不依赖 Lua、不触发子请求、不走 rewrite 阶段,也不受 if 或变量重写影响。
精度说明
- 使用
CLOCK_MONOTONIC或gettimeofday()(取决于系统支持),保证单调性和高分辨率 - 输出为浮点数,小数点后默认三位(如
0.123表示 123 毫秒) - 可用
$request_time_ms直接获取整数毫秒值(Nginx ≥ 1.19.7),避免浮点截断风险
注意事项
- 该变量仅在请求完整结束(无论成功或失败)后才写入日志;中途断连、超时、client closed 错误等未完成请求不会记录
$request_time - 它不包含日志写入本身耗时(log write 是后续异步动作)
- 它不包含 DNS 解析、SSL 握手等待等前置阻塞时间(这些属于 TCP 连接建立前,不在 Nginx 请求生命周期内)
和其他时间变量的关系
-
$upstream_response_time:只算 Nginx 与 upstream 建连 + 收完响应的时间,起点晚于$request_time -
$upstream_connect_time:仅建连阶段(含 SSL handshake),是$upstream_response_time的子集 -
$request_time − $upstream_response_time的差值,反映的是 Nginx 自身处理开销(如 gzip、sub_filter、large_client_header_buffers 解析等)
所以 $request_time 本质是一次请求在 Nginx 工作进程内的生命周期耗时测量值,不是估算、不是采样、也不是统计平均——它是每次请求的真实、单次、端到端(对 Nginx 而言)计时结果。











