Nginx可通过自定义日志格式记录端到端及各阶段耗时:$request_time为总耗时,$upstream_connect_time、$upstream_header_time、$upstream_response_time分别表示建连、首行响应、完整响应时间,需在proxy_pass生效的location中配置且后端正常返回才有效。

Nginx 本身不直接提供“端到端请求耗时”的内置性能基准报表,但可以通过组合日志格式、内置变量和后端响应头,精准记录反向代理链路中各阶段的耗时数据。关键不是开启某个开关,而是正确配置日志字段并理解每个变量的含义。
启用带耗时字段的自定义日志格式
在 http 块中定义一个包含代理相关时间戳的日志格式:
log_format proxy_perf '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time" '
'host=$host req_id=$request_id';其中:
-
$request_time:从接收到客户端第一个字节,到返回最后一个字节给客户端的总耗时(秒,精度毫秒) -
$upstream_connect_time:Nginx 与后端建立 TCP 连接所用时间(如0.002、0.015) -
$upstream_header_time:从发起连接到收到后端响应首行(含状态码)的时间 -
$upstream_response_time:从发起请求到接收完全部后端响应数据的时间(含 header + body)
这些变量只在 proxy_pass 生效的 location 中可用,且需确保后端服务正常返回,否则对应字段会显示为“-”。
绑定日志格式到 server 或 location
在对应虚拟主机或反向代理块中启用该格式:
server {
listen 80;
server_name api.example.com;
access_log /var/log/nginx/proxy_perf.log proxy_perf;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 可选:为每条请求生成唯一 ID,便于跨系统追踪
proxy_set_header X-Request-ID $request_id;
}
}注意:$request_id 是 Nginx 内置变量(需 ngx_http_core_module,1.11.0+ 默认支持),无需额外模块。
验证与解读典型日志行
一条真实日志可能如下:
203.201.12.45 - - [16/Jun/2026:02:15:22 +0000] "GET /v1/users?id=123 HTTP/1.1" 200 342 rt=0.182 uct="0.003" uht="0.047" urt="0.181" host=api.example.com req_id=1a2b3c4d5e6f
解读:
- 总耗时
rt=0.182s(182ms) - 建连仅
0.003s→ 网络延迟低、连接池复用良好 - 头部返回
0.047s→ 后端业务逻辑启动快 - 全响应
0.181s→ 几乎等于总耗时 → 说明 Nginx 自身处理开销极小,瓶颈大概率在后端
若出现 uct="-" 或 urt="-",通常意味着后端不可达、超时或主动拒绝连接。
补充建议提升数据可靠性
- 设置合理的超时,避免单次异常拉高平均值:
proxy_connect_timeout 2; proxy_send_timeout 10; proxy_read_timeout 10;
- 开启
keepalive减少建连开销(尤其对 HTTP/1.1 后端):upstream backend_servers { keepalive 32; server 192.168.1.10:8080; } location / { proxy_http_version 1.1; proxy_set_header Connection ''; # ... 其他 proxy_ 指令 } - 日志轮转配合
logrotate,避免单文件过大影响分析效率。
不复杂但容易忽略:$upstream_* 时间变量只在成功完成代理流程时填充;失败请求(如 502/504)中这些字段为空或为 -,需单独过滤统计。



















