ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Nginx反向代理504排查:proxy_read_timeout默认60秒的坑

2026/9/7 20:31:36 拓冰建站 浏览量
Nginx反向代理504排查:proxy_read_timeout默认60秒的坑 Nginx 反向代理 504 排查proxy_read_timeout 默认 60 秒的坑后端接口明明要跑 70 秒前端却 60 秒准时收到 504。不是服务挂了是 Nginx 反向代理的proxy_read_timeout默认 60 秒比后端先一步放弃。本文讲清楚 Nginx 反向代理超时的三个参数以及长任务的正确解法。一、问题案例做了一个导出报表接口数据量大时要跑 70 秒。本地联调好好的一上线前端准时在第 60 秒弹出一个 504 Gateway Timeout。翻后端日志这个接口其实每次都跑完了返回 200。两边时间线对不上前端 60 秒超时后端 70 秒才返回差着 10 秒。二、原理详解Nginx 默认只等 60 秒Nginx 做反向代理转发请求后要等后端把响应返回。这个等待时间由proxy_read_timeout控制默认 60 秒。接口要 70 秒Nginx 在第 60 秒还等不到响应就主动断开给前端返回 504。而后端浑然不知继续跑第 70 秒跑完了把结果往一个已经断开的连接上丢自然没人接。一个常见的反代配置没写超时就踩了默认值的坑location /api/ { proxy_pass http://127.0.0.1:8080; # 没配 proxy_read_timeout走默认 60 秒 }三、实战代码两种解法方案一调大超时只适合偶尔慢的接口location /api/ { proxy_pass http://127.0.0.1:8080; proxy_read_timeout 120s; # 后端读响应超时 proxy_connect_timeout 10s; # 连后端超时 proxy_send_timeout 120s; # 发请求体超时 }能解燃眉之急但只是把问题往后拖。接口 70 秒、80 秒、甚至更久总不能无脑加超时。方案二长任务异步化正解导出报表这种重活不该用同步接口硬扛。改成异步前端发起导出后端立刻返回一个任务 ID后端后台慢慢跑跑完把文件落到对象存储前端轮询任务状态好了给下载链接。同步接口最多几秒就返回Nginx 默认 60 秒绰绰有余再也不会 504。四、延伸三个超时分清楚Nginx 反代有三个容易混的超时参数含义proxy_connect_timeout连后端建立连接的超时默认 60sproxy_send_timeout把请求体发给后端的超时默认 60sproxy_read_timeout等后端返回响应的超时默认 60s判断方向也简单504 是网关等不到后端响应502 是网关根本连不上后端别搞反。五、总结反代 504先看是不是proxy_read_timeout默认 60 秒被卡住了。长接口别硬调超时改成异步任务 轮询才是正道。504 是等不到响应502 是连不上后端方向不同。上 Nginx 反代超时参数要么显式配要么心里有默认值这根弦。我是无羡小剑全栈偏后端的独立开发者。作品集无羡 · 独立开发者作品集如果对你有帮助欢迎点赞、收藏、关注。