proxy_send_timeout 控制 Nginx 向后端服务器发送请求体时的超时,即 Nginx 主动向 upstream 发送数据过程中等待后端 TCP 接收缓冲区空闲的时间,不涉及响应读取。

proxy_send_timeout 是 Nginx 在 http、server 或 location 块中用于控制**Nginx 向后端服务器发送请求体(request body)时的超时时间**,不是控制后端响应的超时。
它管的是哪一段通信?
这个指令只影响 Nginx 主动向 upstream(如 FastCGI、proxy_pass 目标)发送数据的过程,典型场景包括:
- 客户端上传大文件,Nginx 把接收到的请求体分块转发给后端时,每块之间等待后端接收确认的时间
- Nginx 向后端发送 POST/PUT 的完整 body 数据流过程中,若后端处理慢或网络卡顿,Nginx 等待后端 TCP 接收缓冲区有空闲的时间
注意:它不控制 Nginx 等待后端返回响应头或响应体的耗时(那是 proxy_read_timeout 的职责)。
配置位置和继承关系
可以在 http、server、location 任意层级设置,低层级会覆盖高层级。例如:
http {
proxy_send_timeout 30; # 默认是 60 秒
server {
location /upload/ {
proxy_pass http://backend;
proxy_send_timeout 120; # 此处上传接口放宽到 120 秒
}
}
}
常见误区和调优建议
- 设得太小(如 5 秒)容易在上传大文件、弱网环境或后端负载高时触发
504 Gateway Time-out,错误日志里通常出现upstream timed out (110: Connection timed out) while sending request to upstream - 设得过大(如 300 秒)可能让异常连接长期占用 worker 进程,影响并发能力;应结合业务实际最大上传时长来设定
- 如果后端是 PHP-FPM,还需同步检查
fastcgi_send_timeout,它作用类似但针对 FastCGI 协议层 - 该超时仅在 Nginx 开始发送请求体后才开始计时;如果请求体为空(如 GET 请求),此超时不生效