直接调整 proxy_read_timeout 只能解决 Nginx 主动断开连接导致的 504 报错,如果后端本身处理耗时过长,建议先排查后端性能,确需等待长任务时再调大该值。
先说结论:该参数用于控制 Nginx 等待后端响应数据的最长时间,默认 60 秒,超时返回 504
- 先确认:查看 error.log 是否出现 upstream timed out
- 先处理:根据业务耗时适当增加秒数,避免无限等待
- 再验证:发起长请求测试,观察是否不再中断
负载均衡完整配置示例
标题提及负载均衡,配置需包含 upstream 块。以下示例展示如何在上游服务器组中应用超时设置:
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_read_timeout 300s;
}
}操作步骤
1. 备份配置文件,通常位于 /etc/nginx/nginx.conf 或 conf.d 目录下:
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak2. 编辑配置文件,在 location 块中添加或修改 proxy_read_timeout。注意默认单位为秒,如需毫秒请添加 ms 后缀(例如 1000ms)。
3. 执行以下命令检查语法:
nginx -t4. 确认无误后重载配置:
nginx -s reload验证方法
1. 查看 Nginx error.log,若不再出现 upstream timed out 字样,且访问日志中状态码不再是 504,即表示生效。
grep "upstream timed out" /var/log/nginx/error.log2. 使用 curl 模拟请求测试。确保客户端超时时间大于 Nginx 设置值,以便准确观察 Nginx 行为:
curl `--max-time` 600 -v http://your-nginx-ip/slow-path常见坑
1. 混淆 proxy_connect_timeout 和 proxy_read_timeout,前者是连接超时,后者是读取超时。
2. 设置过大导致客户端等待体验差,建议关注 proxy_send_timeout 或保持默认,避免混淆 client_body_timeout(该参数控制读取请求体超时,与后端响应慢无直接关联)。
3. 后端服务重启或假死时,过长的超时可能占用 Nginx worker 连接数。
参考来源
- Nginx 官方文档,ngx_http_proxy_module,proxy_read_timeout,http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout