Nginx 反向代理请求慢,如何用日志定位上游耗时?
Nginx 反向代理请求变慢时,在访问日志里同时记录请求总耗时和上游连接、响应头、响应完成时间。先对齐上游地址和状态码,再判断应该检查后端处理、连接建立,还是客户端传输。
适用环境
示例面向 Linux 上使用 HTTP 反向代理的 Nginx 1.24 或更新版本,需有配置修改、日志读取和重载权限。本文根据官方文档整理,未在目标环境实测。
为目标站点添加耗时字段
将 log_format 放在 http 块。把下面的 access_log 放在现有的目标 server 或 location 块,并按部署环境调整路径。如果目标块继承了访问日志,新增本级配置前要保留所需的原日志规则,避免意外改变日志去向。
log_format upstream_timing '$time_iso8601 method=$request_method status=$status '
'rt=$request_time upstream="$upstream_addr" us="$upstream_status" '
'uct="$upstream_connect_time" uht="$upstream_header_time" '
'urt="$upstream_response_time"';
access_log /var/log/nginx/upstream-timing.log upstream_timing;时间字段以秒为单位,精度为毫秒。rt 从读取客户端首批字节起统计到写访问日志时。uct 记录建立上游连接的时间,HTTPS 上游也包含 TLS 握手。uht 表示取得上游响应头的耗时,urt 表示取得完整上游响应的耗时。它们是同一次尝试的时间指标,不能直接相加。Nginx 访问日志模块 · Nginx 上游变量文档。
用一条请求验证配置
sudo nginx -t
sudo systemctl reload nginx
curl -sS -o /dev/null -w 'http=%{http_code} total=%{time_total}\n' https://proxy.example.com/health
sudo tail -n 10 /var/log/nginx/upstream-timing.log仅在配置检查通过后重载。这里假定服务由 systemd 管理,域名和路径需替换成真实的只读探测入口。对照请求时间、状态码和目标实例,确认预期日志文件出现包含 rt、uct、uht、urt 的新记录。容器部署应按现有部署方式应用配置。Nginx 配置检查与安全重载。
根据日志选择下一步
- uct 明显升高时,先对照上游地址检查网络、连接建立和 TLS 握手。
- uct 很小而 uht 升高时,优先与后端应用日志对齐,检查收到请求到开始返回响应之间的耗时。
- uht 较小而 urt 较高时,检查响应体大小、流式输出和上游传输。若 rt 明显高于 urt,也检查客户端上传或下载速度以及代理缓冲,差值本身无法单独定责。
- 出现多组值时,按位置对齐 upstream、us 和各耗时字段,检查是否重试或发生内部跳转。短横线表示该字段没有可记录的值,可能来自本地响应或缓存命中等路径。
这些信号用于缩小排查范围。比较同一入口和相近请求大小下的正常样本与慢样本。如果日志显示返回 404,可先核对转发给上游的 URI。proxy_pass 末尾斜杠与上游路径。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭