504错误源于Nginx等待后端响应头超时,需检查error.log中“upstream timed out (110)”及proxy_read_timeout等三类超时配置,并确认其作用域、client_body_buffer_size是否过小导致IO阻塞。

看 error.log 里那句 upstream timed out (110)
504 不是凭空来的,Nginx 会在 /var/log/nginx/error.log 里记下真实原因。重点找这行:upstream timed out (110: Connection timed out) while reading response header from upstream —— 它说明 Nginx 已连上后端,但卡在等第一个响应字节。
注意括号里的 110:这是 Linux 的 errno,Connection timed out 指 socket 层超时,不是应用层慢;如果看到的是 113: No route to host 或 111: Connection refused,那根本不是 504,而是 502。
- 先用
tail -f /var/log/nginx/error.log复现请求,盯住实时日志 - 别只搜 “504”,要搜 “upstream timed out” 和具体 upstream 名(比如
backend) - 同一请求若反复出现不同 errno,说明网络或防火墙不稳定,不是单纯调超时能解决的
确认你改的是哪个 location 块里的 proxy_read_timeout
proxy_read_timeout 只在真正匹配请求路径的 location 块里生效,写在 http 或 server 块里基本白搭——作用域优先级是 location > server > http。
比如你要代理报表接口 /report/export,就得这样配:
以 CLI 为先的表单构建器,采用 BYOK 理念。通过JSON Schema 生成美观的 HTML 表单,使用您自己的 SMTP 服务器处理提交,存储响应...
location /report/ {
proxy_pass http://backend;
proxy_read_timeout 1200;
}
- 别用正则 location 匹配 PHP 时还写
proxy_read_timeout:PHP-FPM 走 FastCGI,得用fastcgi_read_timeout - 数值直接写数字,如
1200表示 1200 秒;写1200s合法但多余 - 严禁设为
0:Nginx 会无限等待,worker 进程卡死,最终耗尽worker_connections引发雪崩
检查 client_body_buffer_size 是否拖慢了大请求体接收
504 常被误判为“后端慢”,其实 Nginx 自己还没把请求收完就断了——尤其是上传大文件、带长 Cookie 或复杂 JWT 的请求。
client_body_buffer_size 控制 Nginx 接收请求体时用多少内存缓冲;太小会触发磁盘临时文件写入,IO 慢到让整个代理链卡住,间接导致 proxy_read_timeout 触发。
- 默认值通常只有 8k 或 16k,上传 10MB 文件极易触发磁盘 IO
- 配合
client_max_body_size一起调:比如设client_max_body_size 100m,就至少配client_body_buffer_size 1m - 这个参数必须放在
server或location块里,不能只写在http块
别漏掉 proxy_connect_timeout 和 proxy_send_timeout
proxy_read_timeout 只管“等响应”,但前面两个阶段更容易先超时:
-
proxy_connect_timeout:Nginx 连后端 TCP 的时限。跨机房、Java 应用冷启动时建议设为180 -
proxy_send_timeout:Nginx 往后端发完整个请求体的时限。大文件上传遇弱网时易触发,建议设为300,和proxy_read_timeout协调 - 它们和
proxy_read_timeout无继承关系,不显式写就是沿用默认 60 秒
三者必须配套调整,否则只拉长 proxy_read_timeout 就像给没油的车猛踩油门——前面两步早卡死了。

















