必须按业务语义分离长短请求:静态资源、API、上传下载、实时流各自独立配置,通过location路径匹配(如/upload/、/api/v1/report)避免泛匹配;关键超时参数需差异化设置,如proxy_read_timeout设300–600s、keepalive_timeout设650s;启用异步转发与临时落盘,关闭proxy_request_buffering并指定proxy_temp_path;长请求需专项分配连接与缓冲资源,如upstream keepalive 32、proxy_buffers 8 256k;监控应关注P95/P99延迟及抖动比值,结合$request_time和Prometheus直方图识别真实长尾与缓存击穿。

精准区分长请求与短请求
混在一起处理会让监控失真、超时策略失效。必须按业务语义分离:静态资源、API接口、上传下载、实时流等各自独立配置。用 location 块做路径匹配,比如 /upload/、/api/v1/report、/stream/,避免用泛匹配 ~ \.php$ 一类规则覆盖所有动态请求。
调整关键超时参数
默认的 60 秒对长请求完全不够,但也不能无限制延长。重点调以下几项:
- proxy_read_timeout:设为 300–600s,适用于后端处理耗时长的场景(如报表生成、视频转码);
- proxy_send_timeout:同样设为 300s 左右,防止大文件分块传输中断;
- client_body_timeout 和 client_header_timeout:上传类请求可设为 120s,防慢速攻击同时兼容弱网;
- keepalive_timeout:客户端侧建议 650s,略小于后端服务的连接超时,避免单边断连。
启用异步转发与临时落盘
对于大文件上传或流式请求,不建议让 Nginx 等待后端全部处理完再返回。推荐做法:
- 关闭请求体缓冲:
proxy_request_buffering off;,让数据边收边写入临时文件; - 指定临时路径:
proxy_temp_path /data/nginx/upload_temp 1 2;,确保磁盘 I/O 不打满系统盘; - 配合
post_action触发异步任务,例如将元数据转发到消息队列,由后台服务消费处理。
连接与缓冲资源专项分配
长请求会持续占用 worker 连接和内存,需单独保障其资源池:
- 在 upstream 中为长请求后端设置
keepalive 32;,复用连接降低握手开销; - 增大代理缓冲区:
proxy_buffer_size 128k; proxy_buffers 8 256k;,避免频繁 flush; - 限制单个长请求最大体大小:
client_max_body_size 2g;,并配合client_body_buffer_size 128k控制内存使用。
监控与抖动识别不能只看平均值
长请求的 P95/P99 延迟比均值更重要,且要识别是否集中超时:
- 日志中必须记录
$request_time和$msec,不用$upstream_response_time(静态资源不走 upstream); - 接入 Prometheus,用
histogram_quantile(0.95, rate(nginx_request_seconds_bucket[5m]))查真实长尾; - 叠加
stddev_over_time(request_time[5m]) / avg_over_time(request_time[5m]),比值 >0.4 就说明抖动严重,大概率是磁盘缓存击穿或上游限流导致。


















