要在nginx日志中记录请求耗时,需在log_format中添加$request_time变量(单位秒、精度毫秒,自0.5.6起支持),绑定至access_log并重载配置;其表示从接收首字节到发送完响应的nginx内部总耗时,不含tcp握手、客户端上传及网络传输延迟。

要在 Nginx 日志中集成请求处理耗时字段,核心是启用 $request_time 变量并正确配置日志格式。它从接收客户端第一个字节开始计时,到响应最后一字节发送完毕为止,单位为秒、精度毫秒,自 Nginx 0.5.6 起原生支持,Windows 官方版也完全可用。
修改 log_format 添加 $request_time
在 nginx.conf 的 http 块内定义或修改日志格式,确保 $request_time 出现在字段中:
- 推荐写法(清晰可读,末尾单独记录):
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$request_time;' - 注意:不能使用默认的
combined格式名覆盖,需另起名称(如main或timed); -
$request_time只能在log_format中使用,不可用于if或重写规则。
绑定 access_log 使用该格式
在 http 块或具体 server 块中,将 access_log 指令指向你定义的格式名:
- 例如:
access_log logs/access.log main; - 路径建议用相对路径(如
logs/access.log)或绝对路径(Windows 下如C:/nginx/logs/access.log); - 若同时需要后端耗时,可一并加入
$upstream_response_time,便于对比分析瓶颈所在。
验证配置并生效
保存配置后,必须执行两步操作才能让新字段出现在日志中:
- 运行
nginx -t检查语法是否正确; - 执行
nginx -s reload(Linux/macOS)或重启 Nginx 服务(Windows); - 发起一次请求后,打开
access.log,末尾应出现类似0.023的数值——这就是本次请求总耗时(秒)。
补充:区分关键耗时变量
仅记录 $request_time 只能看整体延迟,定位问题还需结合其他变量:
-
$upstream_response_time:Nginx 等待后端(如 PHP-FPM、Java 服务)返回响应的时间,不含 Nginx 自身处理开销; - 两者差值大(如
$request_time - $upstream_response_time > 0.3),说明瓶颈可能在 Nginx 配置、重写规则、SSL 握手或网络传输; - 若
$upstream_response_time为空或为-,需检查proxy_pass是否配置正确、后端是否可达、超时参数(proxy_connect_timeout等)是否合理。











