nginx中各类timeout的含义及推荐值

Nginx 中的超时(Timeout)配置是保障服务器性能、稳定性和资源高效利用的关键参数,主要分为客户端超时、代理超时和连接保持超时三大类。以下是各类超时参数的含义及配置建议,结合生产环境的最佳实践整理而成:

⏱️ 一、客户端超时(Client-Side Timeouts)

  1. client_header_timeout
    • 含义:等待客户端发送完整 HTTP 请求头的最大时间。若超时,Nginx 返回 408 Request Time-out。

    • 默认值:60 秒 。

    • 建议配置:

    ◦ 常规服务:5–30 秒(如 API 网关建议 10 秒)。

    ◦ 高延迟网络(如移动端):可延长至 30 秒,避免因网络抖动中断连接。

  2. client_body_timeout
    • 含义:等待客户端发送请求体的间隔时间(非总时长)。超时则关闭连接。

    • 默认值:60 秒 。

    • 建议配置:

    ◦ 普通表单提交:5–30 秒 。

    ◦ 大文件上传:300 秒以上(需配合 client_max_body_size 限制)。

  3. send_timeout
    • 含义:向客户端发送响应的两次写操作间隔时间。超时则关闭连接。

    • 默认值:60 秒 。

    • 建议配置:

    ◦ 静态资源/CDN:10–30 秒 。

    ◦ 大文件下载:120 秒以上(如视频流服务)。

🔁 二、代理超时(Proxy-Side Timeouts)

  1. proxy_connect_timeout
    • 含义:Nginx 与后端服务器建立 TCP 连接的超时时间(含 SSL 握手)。

    • 默认值:60 秒 。

    • 建议配置:

    ◦ 内网低延迟:1–5 秒 。

    ◦ 跨地域/高延迟:15–30 秒(如云服务跨区调用)。

  2. proxy_send_timeout
    • 含义:向后端发送请求的两次写操作间隔时间。

    • 默认值:60 秒 。

    • 建议配置:

    ◦ 普通请求:30–60 秒 。

    ◦ 大文件上传至后端:≥900 秒(如 1GB 文件在 10Mbps 带宽下需约 15 分钟)。

  3. proxy_read_timeout
    • 含义:从后端读取响应的最大等待时间(含后端处理时间)。

    • 默认值:60 秒 。

    • 建议配置:

    ◦ API 服务:30–60 秒 。

    ◦ 长任务处理(如报表生成):300 秒以上(需与后端服务超时对齐)。

🔗 三、连接保持超时(Keepalive Timeouts)

  1. keepalive_timeout
    • 含义:客户端连接空闲保持时间(长连接复用)。

    • 默认值:75 秒 。

    • 建议配置:

    ◦ 高并发网站:15–30 秒(减少资源占用)。

    ◦ API 网关:30–60 秒(平衡连接复用与释放效率)。

    ◦ WebSocket/实时推送:60 秒以上(需配合 proxy_http_version 1.1)。

    • 特殊说明:

    ◦ 格式支持两个参数:keepalive_timeout 30s 25s;(服务端超时 30 秒,响应头通知客户端 25 秒)。

    ◦ 实际生效时间取客户端与服务端设置的最小值(例:服务端设 30 秒,客户端设 20 秒 → 20 秒后连接关闭)。

⚙️ 四、其他关键超时参数

• resolver_timeout:DNS 解析超时,默认 30 秒,建议 10 秒(避免 DNS 故障拖累服务)。

• fastcgi_read_timeout:PHP-FPM 响应读取超时,类比 proxy_read_timeout,建议 30–60 秒 。

• lingering_timeout:客户端关闭连接后,Nginx 等待剩余数据的超时,默认 5 秒,建议 20 秒 。

📊 五、配置场景推荐值总结

场景 关键参数 推荐值 说明

API 网关 proxy_read_timeout 15–25 秒 快速失败,避免阻塞

client_header_timeout 5–10 秒

大文件上传/下载 client_body_timeout 300 秒+ 根据带宽调整

proxy_send_timeout 900 秒+

高并发 Web 服务 keepalive_timeout 15–30 秒 防连接泛滥

worker_connections ≥2048 配合连接数限制

WebSocket proxy_read_timeout 60 秒+ 需心跳保活

keepalive_timeout 60 秒

🛠️ 六、配置示例与调优建议

http {
# 客户端超时
client_header_timeout 10s;
client_body_timeout 30s;
send_timeout 20s;

# 连接保持
keepalive_timeout 30s 25s;  # 服务端30秒,通知客户端25秒

# 代理超时
proxy_connect_timeout 5s;
proxy_send_timeout 15s;
proxy_read_timeout 30s;

server {
    location /api/ {
        proxy_pass http://backend;
        proxy_read_timeout 25s;  # API场景单独缩短
    }
    location /upload/ {
        client_body_timeout 300s;  # 大文件上传
        proxy_send_timeout 900s;
    }
}

}

调优步骤:

  1. 基线监控:
    grep "timed out" /var/log/nginx/error.log # 定位超时报错

  2. 分层测试:
    • 用 curl -v 或 k6 压测,观察 request_time 与 upstream_response_time 。

  3. 灰度调整:
    • 先修改 1% 流量,监控错误率(5xx)和 P99 延迟。

⚠️ 七、避坑指南

  1. 超时冲突:
    • 负载均衡器(如 AWS ALB)的超时需 ≥ Nginx 的 proxy_read_timeout,否则触发 504 Gateway Timeout 。

  2. 资源泄漏:
    • 过长的 keepalive_timeout 会导致文件描述符耗尽,需配合 worker_connections 限制。

  3. NAT 超时:
    • 移动网络 NAT 表可能 60 秒回收连接,建议每 55 秒 发送心跳包。

合理配置 Nginx 超时是性能与稳定性的基石,需根据业务场景、网络环境和后端能力动态调整。核心原则:
• 客户端超时防慢连接攻击,代理超时对齐后端 SLA,连接复用平衡资源与效率。

• 持续监控日志(error.log)及指标(如 Prometheus 的 nginx_connections_active),实现闭环调优。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容