资讯 Caddy 2.11.7:修掉 2.11.6 默认超时引发的 panic 与流截断,新增 Incremental 头

2026-11-01 20:02:38

Caddy 2.11.7:修掉 2.11.6 默认超时引发的 panic 与流截断,新增 Incremental 头

Caddy 2.11.7(10 月 3 日)是补丁版本,修 2.11.6 引入的回归——HTTP/2 代理崩溃、流在一分钟后被切断——同时加入对 Incremental 头字段(RFC 10036)的支持。还在 2.11.6 上的建议升级。

2.11.6 的默认 idle 超时暴露了三个问题

2.11.6 为了缓解慢速攻击引入了默认 idle 读/写超时,具体触发场景里出了三种问题。

HTTP/2 上请求体读完、handler 已返回后 panic(#8101)

2.11.6 里请求体的 idle deadline 生命周期可以比设置它的 handler 更长。HTTP/2 下 reverse proxy 在 handler 返回之后仍在读请求体,触发 nil pointer dereference 崩溃。#8107 把请求体 deadline 的所有权在 handler 返回时结束。

HTTP/1.1 上带 body 的流式响应在读完 body 后 60 秒被截断(#8103)

当流式响应对应一个带请求体的请求,典型是客户端用 POST 打开的 SSE 流,请求体读完后正好 60 秒,连接被切断。同样是 #8107 修复。

HTTP/2 上写入间隔超过 write_idle 的静默 SSE 被 stream error 重置(#8118、#8119)

流式响应在两次写入之间停顿超过 write_idle(默认 1 分钟),比如安静的 SSE 流,会被 stream error 重置。按文档,只有真正发生写入停滞才应该计时,正常“暂时没数据可发”不应该触发。#8119 修正了 idle writer 在两次写之间终止 h2 response writer 的行为。

从 2.11.6 起,像 respond 的 header 这种把未知占位符按原样保留的位置,在请求里没有对应 cookie 时会字面输出 {http.request.cookie.*}。普通 HTTP 请求上的 {http.request.tls.*} 也一样。2.11.7 中两者重新回退为空串。

Incremental 头(RFC 10036)

这是 NGINX 专有 X-Accel-Buffering 的标准替代。上游响应带 Incremental: ?1 时:

HTTP/1.1 200 OK
Content-Type: text/event-stream
Incremental: ?1
  • reverse_proxy 立即转发,效果等同 flush_interval -1;
  • encode 直接流式输出,不再压着。

Mercure、SSE 以及其他流式应用可以直接用这个头表达“不要缓冲”。

如果配置了 request_buffers 或 response_buffers 会阻止增量转发,Caddy 按 RFC 要求返回 501 Not Implemented,而不是悄悄缓冲。新增的 proxy_status_name 选项会给这类响应加上 Proxy-Status 头,说明消息为什么被拒绝。

2.11.6 里其他需要知道的变化

  • 慢速攻击缓解:新增的 idle 读写超时在每次成功读或写后重置;卡住的连接被切断,仍在推进的慢连接不受影响。可选最小传输速率,并新增 timeouts handler 指令做按路由调优(#7913)。
  • 新 url_pattern 请求匹配器:按 URLPattern 标准匹配,语法与浏览器(JS)和很多框架一致;支持命名组、通配符和 regexp 分量;捕获的组变成占位符 {http.url_pattern..},另有 url_pattern CEL 函数(#7787)。
  • 新全局选项 tls_automate_names:管理证书,但不需要在 site block 里提供服务(#8015)。
  • 新 server 选项 expected_underscore_headers:2.11.4 丢弃带下划线的头字段如果影响了应用,可以列出要保留的具体头(#7809)。
  • 安全:同一路由同时使用 forward_auth 和 reverse_proxy 时,请求可能被发到错误的 upstream 连接(GHSA-6365-7ppr-5r92、#7859);上游的 hop-by-hop 头在 101 Switching Protocols 响应里也会被剥离。
  • handle_path 和 uri 的 strip_prefix / strip_suffix 现在会规范化结果路径,避免绕过基于路径的鉴权。
  • path_regexp 匹配器规范化 Windows 反斜杠,补完 CVE-2026-52844 的修复(#7858)。
  • 其余安全项:header-alias filter 扩展到 .,防止在 PHP/FastCGI 后端场景下绕过 forward_auth 的 copy_headers;fastcgi 不再把客户端的 Proxy 头当作 HTTP_PROXY 传给后端(HTTPoxy,#7934);reverseproxy 的 sticky session cookie 哈希改为常量时间比较(#7853);admin 远程访问检查里请求路径做规范化,origin/host allow-list 大小写不敏感(#7910、#7973、#7993)。

升级判断

  • 在 2.11.6 上:升级到 2.11.7。panic 和流被截断都是这次发布引入的回归,补丁版本直接覆盖。
  • SSE / Mercure 场景:检查是否有用 POST 打开的流(对应 #8103);检查 write_idle 是否短于流的实际写入间隔;长时间静默的流确认 flush_interval 的取值。升级后仍有上游侧缓冲问题的话,让上游返回 Incremental: ?1。
  • 从 nginx 迁移:把上游的 X-Accel-Buffering: no 换成标准的 Incremental: ?1,reverse_proxy 与 encode 都会按增量方式处理。
  • 同一路由里同时有 forward_auth 和 reverse_proxy:升级到 2.11.7,避免请求落到错误的 upstream 连接(GHSA-6365-7ppr-5r92)。
  • 用 handle_path / uri 的 strip_prefix、strip_suffix 做路径前缀再交给鉴权:升级,让结果路径先规范化。
  • 2.11.4 之后被下划线头影响过的应用:用 expected_underscore_headers 把要保留的头列出来。
复制全文 生成海报 Caddy 反向代理 SSE 运维

推荐文章

程序员茄子在线接单