Nginx 通过预设超时参数(如 proxy_read_timeout)控制后端响应等待时间,超时即返回 504;需协同配置 proxy_connect_timeout 和 proxy_send_timeout,504 仅在成功连接后端但响应超时时触发。

Nginx 本身不会主动“检测”后端响应耗时并动态返回 504,而是通过预设的超时机制,在等待后端响应超过指定时间后,主动中断连接并返回 504 Gateway Timeout。关键在于正确配置与代理相关的超时参数,而非运行时判断。
设置 proxy_read_timeout 控制等待后端响应的时间
这是最直接相关的指令。它定义 Nginx 从后端服务器读取响应体(包括 headers 和 body)时,两次数据包之间的最大等待时间。若后端在此时间内未发送任何数据,Nginx 就会断开连接并返回 504。
- 默认值通常为 60 秒,对多数场景偏长,建议根据业务合理下调(如 15–30 秒)
- 需放在
location或server块中,且仅在启用proxy_pass时生效 - 示例:
proxy_read_timeout 20;
配套设置 proxy_connect_timeout 和 proxy_send_timeout
这三个 timeout 是协同工作的,共同构成完整的代理请求生命周期控制:
-
proxy_connect_timeout:Nginx 与后端建立 TCP 连接的最长等待时间(通常设为 5–10 秒) -
proxy_send_timeout:Nginx 向后端发送请求体时,两次写操作间的超时(适用于大 POST 请求) - 三者缺一不可;若只调
proxy_read_timeout,而连接阶段卡住,可能触发其他超时或系统级限制
确认后端真实不可达时才会返回 504
504 表示 Nginx 能连上后端,但后端迟迟不返回完整响应。以下情况不会触发 504:
- 后端根本连不上 → 返回 502 Bad Gateway(由
proxy_connect_timeout或网络问题引发) - 后端立即返回错误响应(如 500)→ Nginx 直接透传,不等超时
- 后端响应头已返回,但响应体发送极慢 → 此时
proxy_read_timeout才起作用
验证和调试建议
上线前建议用简单方式模拟慢响应来验证配置是否生效:
- 用 Python/Node.js 启一个延迟返回的测试服务(如 sleep(25) 后输出)
- 用
curl -v观察响应状态码和 timing - 检查 Nginx error log,超时时通常会有类似
upstream timed out (110: Connection timed out)的记录 - 注意:Linux 系统的
net.ipv4.tcp_fin_timeout等内核参数一般不影响此逻辑,无需调整


















