看 Nginx 访问日志判断慢,很多人只盯 $request_time,但它包含的是从读到客户端第一个字节到发完响应的全程,其中既有后端耗时,也有网络回传耗时。真正该先看的是 $upstream_response_time,它只算后端吐完响应的时间。两者一减,剩下的就是 Nginx 自身和链路的时间。
三个字段的实际含义
$request_time:Nginx 收到客户端首字节起算,到把响应完全发出去为止,单位秒,精度毫秒。$upstream_response_time:连上 upstream 到读完响应体,不含连接建立前的排队。$request_length与$bytes_sent:请求体与响应体字节数,用来判断是不是大响应导致的传输慢。
只开 $request_time 的时候,一个 3 秒的请求你无法区分是 PHP 慢、还是图片太大传得慢。把三个字段一起打出来就好办了。
日志格式怎么加
在 http 或对应 server 块里定义:
log_format slow '$remote_addr $request "$request_time" "$upstream_response_time" $request_length $bytes_sent';
然后在 access_log 指定这个格式。注意 $upstream_response_time 在多次重试时会是逗号分隔的多个值,比如 0.12, 0.98,这时候慢的是第二次尝试,别按第一个值算。
四类落点的快速判断
- 两个值都大且接近:瓶颈在后端,去查慢查询、外部 API、PHP-FPM 进程数。
$request_time大而$upstream_response_time只有几十毫秒:传输慢,重点看$bytes_sent是否过大、是否开了 gzip、客户端是否在弱网。$upstream_response_time为-:请求没走到后端,命中了静态文件或直接返回了错误码。- 两者都小但客户端仍喊慢:问题在客户端侧或 DNS/TLS 握手,不在你这台机器。
先定位再看指标
把超过 2 秒的请求单独落一份日志:
if ($request_time > 2) { access_log /var/log/nginx/slow.log slow; }
这样一天下来 slow.log 的行数就是真实的慢请求量,比事后 grep 全量日志快得多。配合 $upstream_addr 还能看出是哪台后端在拖。
本文首发于 izzsj.com,作者保留全部权利。未经书面授权,禁止任何形式采集、转载与镜像;转载请注明来源并保留原文链接。
相关阅读
- 使用IMG2KVM快捷为Proxmox导入IMG镜像img2kvm是一个在PVE下导入IMG文件到虚拟机的工具,可以将img文件(含gz的压缩格
- 最新WIN10镜像下载.文件名 cn_windows_10_business_edition
- fail2ban 防暴力破解实战:让扫描器无处下手
- VPS 怎么选?国内外主机、线路与配置全解析(2025版)





还没有评论,来说两句吧...