×

文章
2024.06.08

Nginx 反代超时,不是 worker 挂了

1 分钟读完 2074 次阅读 Nginx Nginx 反向代理 超时

排盘有时要连算好几盘,PHP 还没返回,浏览器已经 504。以前我会去看 PHP-FPM 是不是挂了。这次 error.log 写得很清楚:upstream timed out。

三层超时

浏览器、Nginx、PHP 各有各的钟。Nginx 默认 proxy_read_timeout 60s,FPM 的 request_terminate_timeout 如果更长,Nginx 先断开,PHP 还在算,日志对不上。

location /api/ {
    proxy_pass http://127.0.0.1:9001;
    proxy_connect_timeout 3s;
    proxy_send_timeout 60s;
    proxy_read_timeout 90s;
}

我把读超时放到 90s,PHP 限在 80s。谁先停,心里有数。真正该做的是把长任务拆出去,接口不要同步硬扛。

顺手改的

  • proxy_buffering on,小响应少占 worker。
  • 反代头带上 X-Request-Id,PHP 日志和 access.log 能对上。
  • 健康检查别用排盘这种重接口,用一个只查 SELECT 1 的 ping。

504 不一定是挂了。经常是前面的人等不及,后面的人还在算。