GeoServer і PostGIS: важны VPN-шлях сервера
Тое, што ваш ноўтбук трапляе на GeoServer, нічога не кажа пра тое, ці трапляе GeoServer на PostGIS. Параўнайце дзве крыніцы, мяжу кэша і ўласную крыніцу сховішча даных.
Вы адкрываеце слой у QGIS, і ён прамалёўваецца. Калега ў тым жа VPN атрымлівае памылку для таго ж слоя. Хтосьці робіць выснову, што VPN зламаны, і наступная гадзіна ідзе на перанос базы даных або на адкрыццё порта, якому не было патрэбна ні тое, ні другое. Запыт з працоўнага стала і запыт, які GeoServer робіць да PostGIS, адпраўляюцца з розных машын, у розных сеткавых прасторах імёнаў, з рознымі ўліковымі данымі. Падзел гэтых двух шляхоў — большая частка дыягностыкі.
Два злучэнні, дзве крыніцы
QGIS -> client's permitted path (often the VPN) -> GeoServer listener
GeoServer -> server's permitted path -> PostGIS listener
Другая стрэлка не ўспадкоўвае тунель першага камп’ютара. GeoServer у кантэйнеры мае сеткавы стек кантэйнера, а не хоста, і кантэйнер у маставой сетцы можа дастацца да базы, да якой хост не дастае, або наадварот. Таму адзін і той жа карыстальнік можа і дасягнуць поспеху, і зазнаць няўдачы ў адной сесіі — у залежнасці ад таго, ці адказ прыйшоў з кэша, ці з свежага запыту.
| What you tested | What it proves |
|---|---|
Portal page or GetCapabilities | HTTP reachability to GeoServer only |
| A tile served from cache | nothing about the database |
GetMap for an uncached layer | a datastore query had to happen |
Знайдзіце крок, які сапраўды сарваўся
Адмова на ўзроўні сэрвісу, запыт выявы, які не даходзіць да свайго сховішча даных, і праблема з правамі ў адным слоі выглядаюць падобна на ўкладцы браўзера і зусім інакш у часопісе сервера. Папрасіце канкрэтную аперацыю, а потым прачытайце ўласную падзею GeoServer для той жа адзнакі часу.
curl -s -o /dev/null -w '%{http_code}\n' \
"https://gis.example.com/geoserver/wms?service=WMS&version=1.3.0&request=GetCapabilities"
curl -s -o /tmp/tile.png -w '%{http_code} %{size_download}\n' \
"https://gis.example.com/geoserver/wms?service=WMS&version=1.3.0&request=GetMap&layers=corp:parcels&bbox=-13650000,4500000,-13600000,4550000&width=256&height=256&srs=EPSG:3857&format=image/png"
200 ад другога запыту з праўдападобнай выявай даказвае, што сховішча даных адказала. 200 з дакументам выключэння сэрвісу даказвае, што не адказала, і тэкст выключэння звычайна называе сховішча, а не кліента.
Чытайце сховішча даных з боку сервера
Даведнік PostGIS ад GeoServer пералічвае, што трэба сховішчу: хост, порт, базу даных і ўліковыя даныя. Усё гэта апісвае злучэнне, якое адкрывае GeoServer. Нішто з гэтага не апісвае уваход з кліента на працоўным стале. Чытайце гэтыя чатыры палі як сцвярджэнне пра сеткавы кантэкст сервера, і ўвесь клас заявак «у іх працуе» становіцца развязальным.
Менавіта таму localhost у сховішчы даных — такая частая памылка. Гэта азначае сеткавы кантэкст самога працэсу GeoServer. Калі GeoServer працуе ў Docker, а PostGIS — на хосце, localhost паказвае ўнутр кантэйнера і нічога не знаходзіць, і ніякая налада VPN гэтага не змяняе.
На серверы праверце маршрут, слухача і палітыку аўтэнтыфікацыі менавіта ў такім парадку. Аўтэнтыфікацыя PostgreSQL па хосце параўноўвае адрас крыніцы, які яна бачыць, а шлюз можа яго трансляваць, таму даданне пула кліенцкага VPN у файл HBA рэдка выпраўляе злучэнне на баку сервера. Правярайце так, як гэта зрабіў бы сервер: той жа хост, той жа порт, той жа карыстальнік. Калі гэтая праверка праходзіць, а GeoServer усё яшчэ падае, розніца ў кантэксце працэсу, а не ў базе даных.
ip route get 10.20.5.11
ss -tnp | grep 5432
psql "host=10.20.5.11 dbname=gis user=geoserver" -c 'select 1'
Пулы і кэшы захоўваюць стан паміж зменамі
Пулы злучэнняў сховішча даных трымаюць сокеты адкрытымі. Тунель, што падняўся праз гадзіну пасля стварэння пула, не абавязкова дае пулу новы шлях, а прастойнае злучэнне можа сядзець на мёртвым маршруце, пакуль яго не закрые праверка або тайм-аўт. Праверце налады праверкі ўсталяванага сховішча, замест таго каб меркаваць пра аднаўленне, і пазбягайце спакусы перазапусціць увесь сэрвіс, пакуль не ведаеце, які слой упаў.
Кэшы тайлаў ствараюць люстраное адлюстраванне гэтай праблемы: яны могуць аддаваць карту, што выглядае правільна, яшчэ доўга пасля таго, як злучэнне з базай даных абарвалася. Ачыстка кэша, каб «паглядзець, ці дапаможа», знішчае адзіны доказ, які сказаў бы вам, які шлях быў жывы.
Перадавайце справу, называючы абедзве крыніцы
Апісанне, якое атрымлівае хуткае выпраўленне, называе дзве рэчы: кліенцкі запыт, што дайшоў да GeoServer, і серверную аперацыю, якую GeoServer не змог завяршыць. З абодвума правільны ўласнік можа адрамантаваць шлях, што сарваўся. З толькі першым натуральнае выпраўленне — адкрыць базу даных публічна, што вырашае заяўку, ствараючы горшую праблему.
Запішыце слой, код адказу, выключэнне на баку сервера і кантэйнер або хост, які яго стварыў. Гэта чатыры радкі, і яны цалкам здымаюць неадназначнасць.