无法将 PostGis 连接到数据库和服务器



我按照以下步骤设置QWC服务https://github.com/qwc-services/qwc-services-core#quick-开始,我可以运行演示。但如果加载我自己的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:为什么psql可以';t连接到服务器?,我照着答案做,但没有结果。

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.conf文件:

# - 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

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

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

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

编辑3感谢Devdatta Tenghee的提示,我将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

您能检查位于/etc/postgresql/13/main/postgresql.conf特别是参数列表地址

也许你必须指定你正在收听哪个主机的节目。但是,如果演示示例正在运行,那么数据库配置应该是可以的

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

要使其正常工作,需要解决一些问题。

我假设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"作为命令行参数。

请参阅:在Docker容器内部,如何连接到机器的localhost?

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

最新更新