keepalive_disable是专为兼容旧浏览器而设的“刹车”指令,用于禁用ie6–ie9、firefox10前、safari5.x等特定ua的长连接,仅支持固定关键词且须置于http或server块中。

直接禁用特定旧浏览器的长连接,是解决其复用 TCP 连接时出现响应错乱、页面跳转失败或连接重置等兼容性问题的有效手段。keepalive_disable 不是用来提升性能的,而是专为兜底兼容设计的“刹车”指令。
哪些旧浏览器真需要被禁用长连接
该指令只识别固定关键词,不支持正则或自定义 UA 字符串。实际可用值包括:
- msie6 / msie7 / msie8 / msie9:IE6–IE8 在 POST 后复用连接极易出问题;IE9 部分企业内网系统仍有类似表现
- gecko:特指 Firefox 10 以前版本,存在连接状态竞争条件
- safari:仅影响 macOS 或类 macOS 下较老 Safari(如 Safari 5.x),现代版本无需处理
- konqueror:KDE 桌面遗留环境,现已极少见
- none:显式启用所有浏览器的长连接(可覆盖默认的 msie6)
配置位置与生效逻辑必须清楚
keepalive_disable 只能在 http 块 或 server 块 中设置,不能写在 location 内。它作用于 Nginx 与客户端之间的连接,不影响 upstream。
- 放在 http 块:全局生效,所有虚拟主机都受控
- 放在 server 块:仅对该域名或 IP 的站点生效
- 匹配逻辑:Nginx 解析请求头中的 User-Agent,只要含对应关键词(不区分大小写),就在响应中省略 Connection: keep-alive,并主动关闭 TCP 连接
典型配置与快速验证方法
例如某政务系统仍需兼容 IE8,但上传后跳转失败,日志显示 “connection reset”,可这样配置:
http {
keepalive_disable msie6 msie7 msie8;
# 其他核心配置...
}
验证是否生效:
- 用 IE8 发起请求:
curl -H "User-Agent: Mozilla/4.0 (compatible; MSIE 8.0;)" http://example.com/ - 检查响应头:应无 Connection: keep-alive,而有 Connection: close
- 对比 Chrome 请求:仍应保留 keep-alive 头,确保未误伤现代浏览器
慎用提醒与更温和的替代方案
完全禁用长连接会带来明显开销:每个请求都要重新握手 + TLS 协商,QPS 超过 2000 时延迟上升显著。
- 先确认问题是否真由长连接引发,排除服务端状态未清理、UA 伪造等干扰
- 优先尝试调低 keepalive_timeout(如设为 15s),而非彻底禁用
- 对高并发场景,可同步调高 keepalive_requests(如设为 1000),避免连接频繁重建
- 长期来看,推动客户端升级或服务端协议栈更新,比依赖 keepalive_disable 更可持续











