直接优化 $request_time 不可行,因其为 Nginx 内核计算的毫秒级真实处理时长;应聚焦记录、解析与利用优化:按需在 proxy_pass location 中启用,静态资源禁用;优先使用 $upstream_response_time 分析后端性能;预处理为整型毫秒及分段标记;结合采样、日志轮转降低负载。

直接优化 $request_time 本身不可行,它是由 Nginx 内核精确计算的毫秒级真实处理时长(从读取首字节到发送完响应),无法人为“加速”或“压缩”。真正可优化的是如何记录、解析和利用它,从而提升后续日志分析的效率。
只在必要 location 中启用 $request_time 记录
全局 access_log 中无差别记录 $request_time 会显著增加 I/O 和磁盘写入压力,尤其在高并发静态资源请求场景下。应按需控制输出范围:
- 在 proxy_pass 转发的后端接口 location 块中单独定义带
$request_time的日志格式,例如:location /api/ {<br> log_format upstream_time '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time';<br> access_log /var/log/nginx/api.log upstream_time;<br>} - 对 CSS/JS/图片等静态资源 location,使用精简日志格式(不含
$request_time),减少日志体积和解析负担 - 避免在 rewrite 或内部跳转频繁的 location 中重复记录,防止同一请求被多次计时写入
用 $upstream_response_time 替代部分 $request_time 场景
当关注点是后端服务性能而非 Nginx 自身处理开销时,$upstream_response_time 更具业务意义且更稳定:
-
$request_time包含客户端网络延迟(如慢速上传、弱网下载)、Nginx 读写缓冲、SSL 握手等非后端因素,易受干扰 -
$upstream_response_time仅统计从 Nginx 发起 upstream 请求到收到第一个字节的时间,反映真实后端响应能力 - 若需定位后端慢接口,优先用
$upstream_response_time并配合$upstream_http_x_request_id关联链路追踪
预处理日志字段提升解析速度
原始日志中 $request_time 默认为浮点数(如 0.023),直接导入 Elasticsearch 或 ClickHouse 时需额外类型转换。可在 Nginx 中提前格式化:
- 用
log_format中的$request_time与map指令结合,生成毫秒整数:map $request_time $request_time_ms {<br> default ${request_time}000;<br> ~^(\d+\.\d{3})$ $1;<br> ~^(\d+\.\d{2})$ ${1}0;<br>}
再在 log_format 中使用$request_time_ms,输出如23(毫秒)便于数值聚合 - 添加响应时间分段标记(如
rt_100表示 <100ms),降低下游查询过滤复杂度:map $request_time $rt_level {<br> ~^[0-9]\.[0-9]{3}$ rt_100;<br> ~^([1-9]|[1-9][0-9]|1[0-9][0-9])\.[0-9]{3}$ rt_200;<br> default rt_slow;<br>}
配合日志轮转与采样降低分析负载
全量记录高频率请求的 $request_time 不现实,可通过 Nginx 原生机制实现轻量级采样:
- 使用
access_log的条件记录功能,仅记录慢请求:access_log /var/log/nginx/slow.log main if=$slow_req;<br>map $request_time $slow_req {<br> ~^[1-9]\d*\.[0-9]{3}$ "1";<br> default "";<br>}(此例记录所有 ≥1s 请求) - 配置
logrotate对带$request_time的日志启用压缩(compress)和按大小切分(size 100M),避免单文件过大拖慢 grep 或 log parser - 对测试环境或低优先级服务,用
split_clients实现 1% 请求采样,平衡监控覆盖与资源消耗


















