首页 / 实战手册 / 服务端与发布
GetCapabilities 要等一分钟,客户端直接超时
先看结论
加载图层树时转圈,最后报“服务不可用”。直接打开能力文档地址,等了 58 秒才出来。
现象
GetCapabilities 响应时间 40–60 秒,体积 18 MB。
浏览器或 GIS 客户端在 30 秒时放弃,报网关超时:
504 Gateway Time-out
nginx/1.24.0
单个图层的 GetMap 却只要 200 ms,说明渲染没问题,慢在元数据组装。
原因
| 因素 | 影响 |
|---|---|
| 图层数量 1200+ | 每个图层都要计算边界、SRS 列表、样式清单 |
未配置 namespace 或命名空间混乱 | 需要遍历全部工作区 |
| 每个图层都开启所有 SRS | 能力文档体积与计算量成倍增长 |
| 没有开启能力文档缓存 | 每次请求都重新组装 |
| 服务端 JVM 内存偏小 | 频繁 GC,响应时间抖动 |
排查过程
- 用
curl计时,确认耗时在服务端还是网络上。 - 看响应体积,超过 5 MB 就要考虑裁剪内容。
- 在 GeoServer 日志中观察是否每次都重新计算边界。
curl -o /tmp/cap.xml -w "状态 %{http_code} 大小 %{size_download} 耗时 %{time_total}s\n" \
"http://127.0.0.1:8080/geoserver/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities"
解决方案
开启能力文档缓存,并限制每个图层暴露的坐标系数量。只保留业务实际使用的两三个:
# geoserver 全局设置(web.xml 或环境变量)
GEOSERVER_CSRF_WHITELIST=gis.example.cn
# 关闭每个图层的全部 SRS 列表,改为按需声明
# 编辑图层 -> 发布 -> 坐标参考系统,仅勾选 EPSG:4326 与 EPSG:3857
在 Nginx 层缓存能力文档,按版本号失效。这是见效最快的一层:
proxy_cache_path /var/cache/nginx/gis levels=1:2 keys_zone=gis_cache:64m inactive=1h;
location = /geoserver/wms {
proxy_pass http://127.0.0.1:8080/geoserver/wms$is_args$args;
proxy_cache gis_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 10m;
proxy_cache_use_stale timeout updating;
proxy_cache_lock on;
add_header X-Cache-Status $upstream_cache_status;
}
客户端侧不要每次进入页面都拉完整能力文档。先取图层清单接口,
再用 DescribeLayer 或按需请求单个图层信息:
fetch('/geoserver/rest/layers.json')
.then(function (r) { return r.json(); })
.then(function (list) {
renderLayerTree(list.layers);
});
验证
第一次请求能力文档 10 秒内返回,第二次命中缓存后 50 ms 内返回,
X-Cache-Status 为 HIT。
响应体积从 18 MB 降到 4 MB 以内。
客户端加载图层树不再超时。
先量体积再优化:能力文档慢通常不是算力问题,而是内容太多。 砍掉不必要的坐标系与样式,比加机器有效。
经纬志(2026)。《GetCapabilities 要等一分钟,客户端直接超时》。https://www.jingweizhi.com/cookbook/wms-getcapabilities-timeout.html(访问日期 2026-11-03)。