移动端弱网下keepalive_timeout不能照搬桌面端默认值,因android okhttp实测45–90秒被nat静默切断、ios后台60秒内回收、自研网络层常缩至30–60秒;设60–75秒会导致空等占槽、推高重连率和tls开销。

移动端弱网环境下,keepalive_timeout的最佳数值不是固定值,而是要略短于客户端真实空闲断连时间——通常设为 15–25 秒(纯 API 场景)或 5–10 秒(含 JS/CSS/图片的混合 H5 页面)。
为什么不能照搬桌面端默认值?
移动端连接受多重因素干扰:Android OkHttp 实测常在 45–90 秒被 NAT 或系统静默切断;iOS 后台连接多数 60 秒内回收;App 自研网络层还可能主动缩至 30–60 秒。若 Nginx 设为默认 60–75 秒,连接会“空等”却收不到下一个请求,白白占用 worker 连接槽位,反而推高重连率和 TLS 握手开销。
按业务类型精准设置
-
纯 API 接口服务(登录、订单、埋点上报):设
keepalive_timeout 20 15;—— 服务端等 20 秒,响应头提示客户端按 15 秒复用,留出 5 秒缓冲 -
混合 H5 页面(含 HTML + JS/CSS/图片):设
keepalive_timeout 8 5;—— 加载快、间隙短,过长反而挤占新连接资源 -
启用 HTTP/2 的网关:可设
keepalive_timeout 0;或5;—— 多路复用不依赖单连接长存,Nginx 强留无意义
必须同步调优的配套参数
-
client_header_timeout 30;:防止弱网下上传卡在请求头阶段被误杀 -
send_timeout 60;:避免动态接口生成大图或聚合响应时中途断连 -
keepalive_requests 200;:防止单连接因异常请求长期滞留(API 场景推荐值) - upstream 块中启用
keepalive 32;,并确保proxy_http_version 1.1;和proxy_set_header Connection '';
怎么验证是否调对了?
上线后别只看配置,重点观察三类信号:
- 用
ss -tn | grep :443 | wc -l查 ESTAB 连接数:高峰期持续 > 1000 表明空闲连接堆积过多 - 用
curl -I https://your-api.com/检查响应头:必须含Connection: keep-alive和Keep-Alive: timeout=15(与第二参数一致) - 查 error log:频繁出现
upstream prematurely closed connection,说明后端 keep-alive 超时比 Nginx 短,需对齐











