综合 Caddy 2.11.7 修复超时回归:HTTP/2 反向代理 nil 指针 panic 与恰好 60 秒被切断的流式响应

2026-10-07 21:01:39

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)。

项目信息

复制全文 生成海报 Caddy 反向代理 SSE HTTP 2 运维

推荐文章

程序员茄子在线接单