经纬志
首页 / 实战手册 / 服务端与发布

GetCapabilities 要等一分钟,客户端直接超时

先看结论

加载图层树时转圈,最后报“服务不可用”。直接打开能力文档地址,等了 58 秒才出来。

最后验证 2026-11-03 · 多技术栈 · Nginx 1.24 · 更新 2026-10-29 · 引用本文

现象

GetCapabilities 响应时间 40–60 秒,体积 18 MB。 浏览器或 GIS 客户端在 30 秒时放弃,报网关超时:

504 Gateway Time-out
nginx/1.24.0

单个图层的 GetMap 却只要 200 ms,说明渲染没问题,慢在元数据组装。

原因

因素影响
图层数量 1200+每个图层都要计算边界、SRS 列表、样式清单
未配置 namespace 或命名空间混乱需要遍历全部工作区
每个图层都开启所有 SRS能力文档体积与计算量成倍增长
没有开启能力文档缓存每次请求都重新组装
服务端 JVM 内存偏小频繁 GC,响应时间抖动

排查过程

  1. 用 curl 计时,确认耗时在服务端还是网络上。
  2. 看响应体积,超过 5 MB 就要考虑裁剪内容。
  3. 在 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)。