Incident Report — PMTiles 全文件回源问题

状态:已解决
影响组件: axebbs / SeaweedFS / s3.playmachine.cn OpenResty
根因: OpenResty 全局代理缓存导致 PMTiles 的 Range 请求未按需向 SeaweedFS 回源。

现象

  • SeaweedFS 网络发送与磁盘读取异常高。
  • 14.33 GB PMTiles 文件在地图浏览时会触发数百 GB 的容器内发送量。
  • 浏览器侧却只收到正常的 KB 级 206 Partial Content 响应。

排查过程

  1. 确认目标服务器为 ssh axebbs,SeaweedFS 容器运行在该服务器。
  2. 采集容器网络与磁盘计数,确认 SeaweedFS 的异常发送真实存在。
  3. 检查浏览器实际 PMTiles 请求:
    • 均为 Range 请求;
    • 均返回 206
    • 正常页面加载仅收到约 4 MB 数据。
  4. 直连 SeaweedFS 测试文件头、中段、末尾 Range:
    • 返回正确的 206Content-Range 和 16 KB 数据;
    • 排除 SeaweedFS 本身忽略 Range 的可能。
  5. 对公开地址执行受控测试:请求文件末尾 16 KB。
    • 客户端:收到 16,384 bytes
    • SeaweedFS:实际发送约 14.35 GB
    • 耗时约 11.7 秒
  6. 检查 OpenResty 配置,发现全局启用了:
proxy_cache proxy_cache_panel;

s3.playmachine.cn 的反代 location 未关闭该缓存。

根因

OpenResty 为满足客户端的 Range 响应,先从本机 SeaweedFS 上游读取大量甚至完整 PMTiles 内容,再截取所需范围返回客户端。

因此浏览器看到的是正确的小型 206 响应,但 SeaweedFS 仍承担了完整大文件的内部传输与读取。

修复

修改 s3.playmachine.cn 的代理配置,加入:

proxy_cache off;
proxy_buffering off;
proxy_request_buffering off;

proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_set_header Connection "";

已在修改前创建配置备份,并完成 OpenResty 配置语法检查。

服务操作

仅重启以下容器,未重启整台服务器:

  • seaweedfs
  • 1Panel-openresty-fN1h

两者重启后均恢复为 running

修复验证

再次请求同一 PMTiles 文件末尾 16 KB:

  • HTTP:206 Partial Content
  • Content-Length16384
  • Content-Range:正确
  • Accept-Ranges: bytes
  • 响应时间:约 355 ms
  • SeaweedFS 实际发送增量:约 19 KB(含协议开销)

结论:Range 请求已正确按范围回源,异常 GB 级网络与磁盘占用问题已消除。

后续建议

  • 将这段 S3 OpenResty 配置纳入部署模板,避免 1Panel 或站点重建后丢失修复。
posted @ 2026-07-24 10:47  mcayear  阅读(7)  评论(0)    收藏  举报