【问题标题】:Can't connect PostGis to database and server无法将 PostGis 连接到数据库和服务器
【发布时间】:2022-01-05 19:19:02
【问题描述】:

我按照这些步骤设置了 QWC 服务https://github.com/qwc-services/qwc-services-core#quick-start,我可以运行演示了。但是如果加载我自己的 QGIS 项目,我会收到以下错误消息:

qwc-qgis-server_1              | 07:50:07 WARNING Server[99]: <ServerException>Layer(s) not valid</ServerException>
qwc-qgis-server_1              | 
qwc-qgis-server_1              | 07:50:07 WARNING ClearCapabilities[99]: Cached cleared : /data/MeasurementDemo.qgs
qwc-qgis-server_1              | 07:50:07 WARNING PostGIS[99]: Connection to database failed
qwc-qgis-server_1              | could not connect to server: No such file or directory
qwc-qgis-server_1              |    Is the server running locally and accepting
qwc-qgis-server_1              |    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
qwc-qgis-server_1              | 
qwc-qgis-server_1              | 07:50:07 CRITICAL Server[99]: Error, Layer(s) measurement_b46e976f_2d0f_4bf0_942a_9d9462b40c3e not valid in project /data/MeasurementDemo.qgs
qwc-qgis-server_1              | 07:50:07 WARNING Server[99]: <ServerException>Layer(s) not valid</ServerException>
qwc-qgis-server_1              | 
qwc-config-service_1           | [2022-01-04 07:50:09,360] WARNING in config_generator: Skipping theme item '': Could not get capabilities for /ows/MeasurementDemo
qwc-config-service_1           | [2022-01-04 07:50:19,468] CRITICAL in config_generator: The generation of the configuration files resulted in a failure
qwc-config-service_1           | [2022-01-04 07:50:19,468] CRITICAL in config_generator: The configuration files were not updated!
qwc-config-service_1           | [2022-01-04 07:50:20,856] CRITICAL in config_generator: The generation of the permission files resulted in a failure.
qwc-config-service_1           | [2022-01-04 07:50:20,857] CRITICAL in config_generator: The permission files were not updated!
qwc-config-service_1           | [pid: 15|app: 0|req: 18/18] 172.18.0.11 () {30 vars in 408 bytes} [Tue Jan  4 07:50:05 2022] POST /generate_configs?tenant=default => generated 2881 bytes in 15083 msecs (HTTP/1.1 200) 2 headers in 81 bytes (1 switches on core 0)

由于错误与此问题非常相似:PostgreSQL: Why psql can't connect to server?,我按照答案进行操作,但没有结果。

ps -ef | grep postgres 给我以下结果:

postgres  203911       1  0 07:35 ?        00:00:00 /usr/lib/postgresql/13/bin/postgres -D /var/lib/postgresql/13/main -c config_file=/etc/postgresql/13/main/postgresql.conf

我也找到了插座

/var/run/postgresql/.s.PGSQL.5432

然后我运行命令

psql -h /var/run/postgresql/ GeoDB

但没有结果。之后我检查了ph_hba.conf 文件:

# "local" is for Unix domain socket connections only
local   all             all                                     peer

运行命令pg_lsclusters 给我:

Ver Cluster Port Status Owner    Data directory              Log file
13  main    5432 online postgres /var/lib/postgresql/13/main /var/log/postgresql/postgresql-13-main.log

同样在重启 pg_ctlcluster 和 PostgreSQL 后,错误依旧。

编辑 1 在 cnaimi 的回答之后,我检查了postgresql.confFile:

# - Connection Settings -

#listen_addresses = '*'         # what IP address(es) to listen on;
                                # comma-separated list of addresses;
                                # defaults to 'localhost'; use '*' for all
                                # (change requires restart)
port = 5432                     # (change requires restart)
max_connections = 100           # (change requires restart)
#superuser_reserved_connections = 3 # (change requires restart)
unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories
                                # (change requires restart)
#unix_socket_group = '*'        # (change requires restart)
#unix_socket_permissions = 0777     # begin with 0 to use octal notation
                                # (change requires restart)
#bonjour = off                  # advertise server via Bonjour
                                # (change requires restart)
#bonjour_name = ''              # defaults to the computer name
                                # (change requires restart)

但我找不到错误,因为端口是 5432 并且它侦听所有地址。

编辑 2 在搜索过程中,我发现了几个pg_service.conf 文件:

./qwc-services/qwc-docker/wsgi-service/pg_service.conf
./qwc-services/qwc-docker/qgis-server/pg_service.conf
./qwc-services/qwc-docker/postgis/pg_service.conf
./qwc-services/qwc-docker/pg_service.conf

每一个都包含一个或多个数据库凭据,如下所示:

[qwc_geodb]
host=qwc-postgis
port=5432
dbname=qwc_demo
user=qwc_service
password=qwc_service
sslmode=disable

据我所知,所有文件中的端口都是正确的。但是当然数据库名称和用户/密码是错误的。这会导致错误吗?还是 QWS 通过 .qgs 文件获取凭据?

编辑 3 感谢 Devdatta Tengshe 的提示,我将 PostgreSQL 的主机设置为 127.0.0.1。通过sudo docker-compose ps 可以看到使用的容器及其端口:

                  Name                                Command                  State                      Ports                
-------------------------------------------------------------------------------------------------------------------------------
qwc-docker_qwc-admin-gui_1                 /bin/sh -c uwsgi --http-so ...   Up             127.0.0.1:5031->9090/tcp            
qwc-docker_qwc-api-gateway_1               /docker-entrypoint.sh ngin ...   Up             0.0.0.0:8088->80/tcp,:::8088->80/tcp
qwc-docker_qwc-auth-service_1              /bin/sh -c uwsgi --http-so ...   Up             127.0.0.1:5017->9090/tcp            
qwc-docker_qwc-config-service_1            /bin/sh -c uwsgi --http-so ...   Up             127.0.0.1:5010->9090/tcp            
qwc-docker_qwc-data-service_1              /bin/sh -c uwsgi --http-so ...   Up             127.0.0.1:5012->9090/tcp            
qwc-docker_qwc-elevation-service_1         /bin/sh -c uwsgi --http-so ...   Up             127.0.0.1:5002->9090/tcp            
qwc-docker_qwc-fulltext-search-service_1   /bin/sh -c uwsgi --http-so ...   Up             127.0.0.1:5011->9090/tcp            
qwc-docker_qwc-map-viewer_1                /bin/sh -c uwsgi --http-so ...   Up             127.0.0.1:5030->9090/tcp            
qwc-docker_qwc-mapinfo-service_1           /bin/sh -c uwsgi --http-so ...   Up             127.0.0.1:5016->9090/tcp            
qwc-docker_qwc-ogc-service_1               /bin/sh -c uwsgi --http-so ...   Up             127.0.0.1:5013->9090/tcp            
qwc-docker_qwc-permalink-service_1         /bin/sh -c uwsgi --http-so ...   Up             127.0.0.1:5001->9090/tcp            
qwc-docker_qwc-postgis_1                   docker-entrypoint.sh postgres    Up (healthy)   127.0.0.1:5439->5432/tcp            
qwc-docker_qwc-qgis-server_1               /sbin/my_init                    Up             127.0.0.1:8001->80/tcp              
qwc-docker_qwc-solr_1                      docker-entrypoint.sh solr- ...   Up             127.0.0.1:8983->8983/tcp

【问题讨论】:

  • Postgres 服务器在哪里运行?是在主机上吗?还是在 docker 容器中运行?此外,看起来 qgs 文件正在寻找在 localhost 上运行的 Postgres,但它无法连接,因为该 docker 容器内没有运行 postgres。
  • 感谢@DevdattaTengshe 的提示,这是真的,我没有在 docker 中安装 Postgres。我是否必须使用$ docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres 将其安装在 docker 内?那么它是否适用于所有 docker 容器?
  • 可以创建gqs文件,使用127.0.0.1作为Postgres主机;然后像这样运行这个 docker 容器:stackoverflow.com/questions/24319662/…
  • 感谢您提供此信息,我在将主机设置为 127.0.0.1 时编辑了我的问题,但如果我尝试按照您链接中的答案进行操作,我不确定哪个容器(或全部?)我应该改变我的理解,所有人都已经在使用端口 127.0.0.1。抱歉,我是 docker 新手,对此没有太多经验。

标签: postgresql postgis


【解决方案1】:

你能检查一下 postgres.conf 文件位于 /etc/postgresql/13/main/postgresql.conf 特别是参数listen_address

也许您必须指定您正在收听的主机。 但是如果演示示例正在运行,那么数据库配置应该没问题。

您还可以在 postgres.conf 上检查 postgres 的端口并验证它是 5432。

【讨论】:

  • 感谢您的想法,我从 postgresql.config 文件中添加了一些行,但我在其中找不到错误。
  • 您是否尝试取消注释 #listen_addresses = '*' 行并重新启动 postgres ?我不确定注释行使用的设置。
  • 我完全错过了它的注释,我只是取消注释该行并使用 sudo service postgresql restart 重新启动postgresql,但错误仍然存​​在
  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

有几件事需要修复才能使其正常工作。

我假设您在主机上运行 Postgres 服务器,而不是在任何 Docker 容器中。

当您配置 QGIS 地图文件时,您可能已连接到 localhost,并且此信息已保存在 .qgs 文件中。

这就是为什么您的第一条错误消息说它正在尝试连接到 localhost,但没有找到服务器。此错误是在 qwc docker 容器中引发的。

发生此错误,因为 QGIS 服务器(在 docker 容器内)无法连接到主机上运行的 postgres 服务器,使用 'localhost' 作为主机名

要解决此问题,您需要执行以下操作:

  1. 在 QGIS 中,使用 127.0.0.1 而不是 localhost 连接到 Postgres 服务器。

  2. 使用这个新连接保存您的 qgs 文件。

  3. 为 qwc 运行 docker 容器时,使用--network="host" 作为命令行参数。

见:From inside of a Docker container, how do I connect to the localhost of the machine?

在此之后,qgis 服务器(在 docker 容器内)应该能够使用 127.0.0.1 作为 IP 地址连接到在您的主机上运行的 Postgres 服务器。

【讨论】:

  • 真的很棒,只是第三点会产生问题,因为我使用 docker-compose 而不是 docker run 因为有多个容器。我发现那里不支持--network="host"。据我所知,到目前为止,我应该像stackoverflow.com/questions/56582446/… 一样更改 docker-compose.yml 文件,但到目前为止,此链接中的解决方案不起作用(不支持 network_modenet)。
猜你喜欢
  • 2018-08-03
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 2021-09-15
  • 2013-04-14
相关资源
最近更新 更多