运营点导出近 90 天订单报表,页面转 30 秒后返回 504 Gateway Timeout,nginx 日志里 upstream timed out (110)。同样的报表选 7 天能出,数据量 12 万行。乍看像缓存或者权限的锅,追下去往往不是。
location /export/ {
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
追下去是这么回事:导出走的是同步请求,查库加写 Excel 全在 HTTP 生命周期里完成。30 万行数据光 openpyxl 写入就要四十多秒,早就超过 nginx 的 proxy_read_timeout。数据量一涨,接口必然超时。
碰到「报表导出超时」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,把导出改成异步任务 提交后立刻返回任务号;前端轮询任务状态 完成后给下载链接;后端分批查库 每批五千行 避免一次拉全量;临时调大 nginx 超时只作兜底 不作为方案。
验收就看一点,点击导出后 2 秒内返回任务号,轮询到完成后能下载到完整 30 万行文件,不再出现 504。
