Fiber不设keepalive_timeout参数,因其连接生命周期不由框架控制,而由操作系统TCP keepalive、Nginx反向代理配置(keepalive_timeout、proxy_http_version 1.1、proxy_set_header Connection "")及客户端策略共同决定;Fiber自身需调优ReadTimeout、WriteTimeout(推荐30s)及缓冲区大小,并确保DisableKeepalive=false。

Fasthttp 底层不支持 HTTP/1.1 的 Keep-Alive 响应头自动注入,Fiber 作为其上层封装,默认也不发送 Connection: keep-alive 或 Keep-Alive: timeout=..., max=... 头——这不是漏配,而是设计使然:fasthttp 为极致性能舍弃了部分 HTTP/1.1 兼容性细节,连接复用由 TCP 层和客户端行为主导,服务端无需、也不该靠响应头“劝说”客户端保持连接。
为什么 Fiber 不设 keepalive_timeout 参数
Fiber(基于 fasthttp)本身没有 keepalive_timeout 这类配置项,因为它的连接生命周期不由框架控制,而由以下三层共同决定:
- 操作系统 TCP keepalive 探测(
/proc/sys/net/ipv4/tcp_keepalive_time等) - 反向代理(如 Nginx)的
keepalive_timeout和proxy_http_version 1.1配置 - 客户端(浏览器或 SDK)自身的空闲超时策略(如火狐的
network.http.keep-alive.timeout)
你在 Fiber 代码里加 ctx.Set("Connection", "keep-alive") 没用:fasthttp 会忽略该 header;强行写入也违反 HTTP/1.1 规范(Connection 是 hop-by-hop 头,不应由后端透传或伪造)。
Nginx 与 Fiber 协作时必须配的三项
若 Fiber 前有 Nginx(典型部署),真正起作用的是 Nginx 对「客户端→Nginx」和「Nginx→Fiber」两段连接的分别管理:
-
keepalive_timeout 30s 30s;—— 必须显式设置,且建议 ≤30 秒(高频轮询场景下,比默认 75s 更安全) -
proxy_http_version 1.1;—— 否则 Nginx 默认用 HTTP/1.0 转发,Fiber 收到的请求无持久连接语义 -
proxy_set_header Connection "";—— 清空客户端传来的Connection头,避免干扰 Nginx 与 Fiber 之间的连接复用决策
漏掉任一者,都可能导致客户端复用失败,表现为每个请求新建 TCP 连接(Wireshark 可见大量 SYN/SYN-ACK)。
Fiber 自身需调优的超时与缓冲参数
虽然不控 Keep-Alive,但 Fiber 的 ReadTimeout 和 WriteTimeout 直接影响长连接的实际存活时长:
- 设太短(如
10s):活跃连接可能被误杀,尤其在弱网或高延迟轮询中 - 设太长(如
300s):异常挂起的连接长期滞留,耗尽worker_connections - 推荐值:
ReadTimeout: 30 * time.Second,WriteTimeout: 30 * time.Second,与 Nginx 的keepalive_timeout对齐 - 同时调大
ReadBufferSize和WriteBufferSize至4096,减少 syscall 次数,提升吞吐
注意:fiber.Config{DisableKeepalive: true} 是禁用功能的开关,生产环境必须为 false(默认值),否则强制关闭所有持久连接。
验证长连接是否真生效的三个硬指标
别信日志或文档,看真实流量:
- 用
ss -tan | grep :查看 ESTABLISHED 连接数是否稳定(非暴涨暴跌)| wc -l - 在 Nginx access log 中启用
$connection_requests变量,观察单个 connection 处理请求数是否 ≥50(说明复用成功) - 抓包过滤
tcp.flags.syn == 1 or tcp.flags.fin == 1,SYN/FIN 包比例应显著低于总请求数(理想
最易被忽略的是:Fiber 服务若跑在容器中,宿主机内核的 tcp_fin_timeout 和 net.ipv4.ip_local_port_range 若未调优,会导致 TIME_WAIT 连接堆积,间接杀死新连接复用机会——这和 Fiber 代码无关,但会让所有配置失效。











