Incident Report — PMTiles 全文件回源问题
状态:已解决
影响组件: axebbs / SeaweedFS / s3.playmachine.cn OpenResty
根因: OpenResty 全局代理缓存导致 PMTiles 的 Range 请求未按需向 SeaweedFS 回源。
现象
- SeaweedFS 网络发送与磁盘读取异常高。
- 14.33 GB PMTiles 文件在地图浏览时会触发数百 GB 的容器内发送量。
- 浏览器侧却只收到正常的 KB 级
206 Partial Content响应。
排查过程
- 确认目标服务器为
ssh axebbs,SeaweedFS 容器运行在该服务器。 - 采集容器网络与磁盘计数,确认 SeaweedFS 的异常发送真实存在。
- 检查浏览器实际 PMTiles 请求:
- 均为
Range请求; - 均返回
206; - 正常页面加载仅收到约 4 MB 数据。
- 均为
- 直连 SeaweedFS 测试文件头、中段、末尾 Range:
- 返回正确的
206、Content-Range和 16 KB 数据; - 排除 SeaweedFS 本身忽略 Range 的可能。
- 返回正确的
- 对公开地址执行受控测试:请求文件末尾 16 KB。
- 客户端:收到
16,384 bytes; - SeaweedFS:实际发送约
14.35 GB; - 耗时约
11.7 秒。
- 客户端:收到
- 检查 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 配置语法检查。
服务操作
仅重启以下容器,未重启整台服务器:
seaweedfs1Panel-openresty-fN1h
两者重启后均恢复为 running。
修复验证
再次请求同一 PMTiles 文件末尾 16 KB:
- HTTP:
206 Partial Content Content-Length:16384Content-Range:正确Accept-Ranges: bytes- 响应时间:约
355 ms - SeaweedFS 实际发送增量:约
19 KB(含协议开销)
结论:Range 请求已正确按范围回源,异常 GB 级网络与磁盘占用问题已消除。
后续建议
- 将这段 S3 OpenResty 配置纳入部署模板,避免 1Panel 或站点重建后丢失修复。

浙公网安备 33010602011771号