Caddy 2.11.7 修复超时回归:HTTP/2 反向代理 nil 指针 panic 与恰好 60 秒被切断的流式响应
Caddy v2.11.7(发布于 2026-10-03)修复了 2.11.6 引入的回归,其中包括通过 HTTP/2 反向代理时的崩溃,以及流在一分钟后被切断的问题。如果你正在使用 2.11.6,建议升级。这个版本同时加入了对全新 Incremental 头字段(RFC 10036)的支持。
新默认 idle 超时带来的崩溃与流中断
2.11.6 引入了默认的 idle 读写超时,由此产生了一些问题。
在 2.11.6 中,请求 body 的 idle deadline 可能比设置它的 handler 存活得更久:
- HTTP/2 下,当 handler 已经返回、而反向代理仍在读取请求 body 时,Caddy 可能因 nil 指针解引用而 panic(#8101)。
- HTTP/1.1 下,对带 body 的请求做流式响应时(例如以
POST打开 SSE 流的客户端),响应会在 body 读完之后恰好 60 秒被切断(#8103)。
两者都在 #8107 中修复。
另一处:HTTP/2 下,流式响应如果在两次写之间暂停超过 write_idle(默认 1 分钟),比如安静的 SSE 流,会被以 stream error 重置。按文档说明,只有真正停滞的写才应该计入(#8118、#8119)。
Incremental 头字段(RFC 10036)
Incremental 是 NGINX 私有头 X-Accel-Buffering 的标准替代品。如果上游响应带有 Incremental: ?1,reverse_proxy 会立即转发,效果等同于 flush_interval -1,encode 也会直接流式输出而不是先缓冲。适合 Mercure、SSE 以及其他流式应用。
- 如果
request_buffers或response_buffers选项会阻止增量转发,Caddy 会按 RFC 要求返回501 Not Implemented,而不是静默缓冲。 - 新增的
proxy_status_name选项会为这类响应加上Proxy-Status头,说明消息为何被拒绝。
caddy fmt
caddy fmt 不再删除输入末尾的起始花括号(#8047)。
关于 2.11.6 的默认超时
2.11.6 带来了默认 1 分钟的 idle 读写超时:如果请求 body 的读取或响应的写入停滞(完全没有任何进展)超过该时长,连接会被中止。像 SSE 那样两次写之间的暂停不计入其中。某些客户端在 body 中途静默的长连接流可能受到影响。可以在 server 选项 timeouts 中用 read_body_idle 和 write_idle 调整,也可以通过 timeouts 指令按路由设置(#7913)。
项目信息
- 仓库:caddyserver/caddy
- 发布:v2.11.7