运营点导出近 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。

作者 9823189