GeoServer và PostGIS: đường VPN quan trọng là đường của máy chủ
Việc laptop của bạn tới được GeoServer không nói gì về việc GeoServer có tới được PostGIS hay không. Hãy so sánh hai nguồn gốc, ranh giới bộ nhớ đệm và nguồn của chính kho dữ liệu.
Bạn mở lớp trong QGIS và nó hiển thị. Một đồng nghiệp trên cùng VPN nhận lỗi cho cùng lớp đó. Ai đó kết luận VPN hỏng, và giờ tiếp theo trôi qua để di chuyển một cơ sở dữ liệu hoặc mở một cổng chưa từng cần đến. Yêu cầu từ máy tính để bàn và truy vấn mà GeoServer gửi tới PostGIS xuất phát từ những máy khác nhau, trong những không gian tên mạng khác nhau, với những thông tin xác thực khác nhau. Tách hai đường đó ra là phần lớn của việc chẩn đoán.
Hai kết nối, hai nguồn gốc
QGIS -> client's permitted path (often the VPN) -> GeoServer listener
GeoServer -> server's permitted path -> PostGIS listener
Mũi tên thứ hai không thừa hưởng đường hầm của máy tính thứ nhất. GeoServer trong một container có ngăn xếp mạng của container, không phải của máy chủ, và một container trên mạng cầu nối có thể tới được cơ sở dữ liệu mà máy chủ không tới được, hoặc ngược lại. Vì thế cùng một người dùng có thể thành công và thất bại trong cùng một phiên, tùy việc câu trả lời đến từ bộ nhớ đệm hay từ một truy vấn mới.
| 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 |
Tìm bước thực sự đã thất bại
Một lần từ chối ở mức dịch vụ, một yêu cầu ảnh không tới được kho dữ liệu của nó, và một vấn đề quyền trên một lớp trông giống nhau trong tab trình duyệt và hoàn toàn khác trong nhật ký máy chủ. Hãy yêu cầu thao tác cụ thể, rồi đọc sự kiện của chính GeoServer cho cùng mốc thời gian.
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"
Một 200 từ yêu cầu thứ hai với hình ảnh hợp lý chứng minh kho dữ liệu đã trả lời. Một 200 kèm tài liệu ngoại lệ dịch vụ chứng minh là chưa, và văn bản ngoại lệ thường nêu tên kho chứ không phải máy khách.
Đọc kho dữ liệu từ phía máy chủ
Tài liệu PostGIS của GeoServer liệt kê những gì kho cần: máy chủ, cổng, cơ sở dữ liệu và thông tin xác thực. Tất cả những điều đó mô tả kết nối mà GeoServer mở. Không điều nào mô tả một lần đăng nhập từ máy khách để bàn. Hãy đọc bốn trường đó như một phát biểu về bối cảnh mạng của máy chủ, và toàn bộ nhóm phiếu «bên họ chạy được» trở nên xử lý được.
Đó là lý do localhost trong một kho dữ liệu lại là lỗi phổ biến đến vậy. Nó có nghĩa là bối cảnh mạng của chính tiến trình GeoServer. Nếu GeoServer chạy trong Docker trong khi PostGIS chạy trên máy chủ, localhost trỏ vào bên trong container và không tìm thấy gì, và không cấu hình VPN nào thay đổi được điều đó.
Trên máy chủ, hãy kiểm tra tuyến, bộ lắng nghe và chính sách xác thực theo đúng thứ tự đó. Xác thực dựa trên máy chủ của PostgreSQL so khớp địa chỉ nguồn mà nó thấy, và một cổng có thể dịch địa chỉ đó, nên thêm một nhóm VPN máy khách vào tệp HBA hiếm khi sửa được kết nối phía máy chủ. Hãy kiểm tra như máy chủ sẽ làm: cùng máy chủ, cùng cổng, cùng người dùng. Nếu phép thử đó thành công trong khi GeoServer vẫn thất bại, thì khác biệt nằm ở bối cảnh tiến trình chứ không phải cơ sở dữ liệu.
ip route get 10.20.5.11
ss -tnp | grep 5432
psql "host=10.20.5.11 dbname=gis user=geoserver" -c 'select 1'
Các nhóm kết nối và bộ nhớ đệm giữ trạng thái qua các thay đổi
Nhóm kết nối của kho dữ liệu giữ socket mở. Một đường hầm lên một giờ sau khi nhóm được tạo không nhất thiết cho nhóm một tuyến mới, và một kết nối nhàn rỗi có thể nằm trên tuyến đã chết cho đến khi một lần xác nhận hoặc hết thời gian đóng nó. Hãy kiểm tra thiết lập xác nhận của kho đã cài thay vì giả định sẽ phục hồi, và tránh cám dỗ khởi động lại toàn bộ dịch vụ trước khi biết lớp nào đã hỏng.
Bộ nhớ đệm ô bản đồ tạo ra hình ảnh soi gương của vấn đề đó: chúng có thể phục vụ một bản đồ trông đúng rất lâu sau khi kết nối cơ sở dữ liệu đã đứt. Xóa bộ nhớ đệm để «xem có giúp không» phá hủy mẩu bằng chứng duy nhất cho biết tuyến nào còn sống.
Chuyển giao với cả hai nguồn gốc được nêu tên
Mô tả nhận được bản sửa nhanh nêu hai điều: yêu cầu của máy khách đã tới GeoServer, và thao tác phía sau mà GeoServer không hoàn thành được. Với cả hai, chủ sở hữu đúng có thể sửa tuyến đã hỏng. Chỉ với điều thứ nhất, cách sửa tự nhiên là phơi bày cơ sở dữ liệu ra công khai, điều này giải quyết phiếu bằng cách tạo ra vấn đề tệ hơn.
Ghi lại lớp, mã phản hồi, ngoại lệ phía máy chủ và container hoặc máy chủ đã tạo ra nó. Đó là bốn dòng, và nó loại bỏ hoàn toàn sự mơ hồ.