无法连接到端口5432上的Postgresql

87

我在运行Ubuntu Server 14.04的服务器上安装了PostgreSQL 9.3。

如果通过终端ssh到服务器,我可以用psql连接。但是当我尝试配置pgAdmin III进行远程连接时,我遇到了以下错误:

服务器未监听,不接受连接:连接库报告无法连接到服务器:"172.24.3.147"上的服务器在端口5432上接受TCP/IP连接吗?

当我在服务器上运行service postgresql status时,它会返回:

9.3/main (port 5432): online

所以,我肯定错过了一些重要的东西。

编辑

在服务器上运行netstat -na时,我得到以下相关部分:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN     
tcp        0      0 172.24.3.147:22         172.24.3.240:61950      ESTABLISHED
tcp        0      0 172.24.3.147:22         172.24.3.240:60214      ESTABLISHED

1
你没有绑定到那个IP地址。PostgreSQL正在监听其他地址,比如可能只是127.0.0.1:5432。 - Marc B
你所说的“bind”是什么意思?我正在使用服务器端口(在ssh中使用),当我尝试通过pgAdmin连接时。 - Rodrigo
你需要告诉pg监听哪个接口/IP来进行连接。如果它只绑定在127.0.0.1:5432上,那么对172.24.3.147:5432的任何尝试都将失败,因为没有在那个IP:端口组合上进行监听。 - Marc B
根据您的评论,应该在22端口上进行读取(为什么,默认值是5432?),对吗?(这就是上面“State=ESTABLISHED”行中的内容)。但是当我尝试连接到pgAdmin上的该端口时,我收到了不同的错误消息:“发生错误:14:57:13:错误:无法连接到服务器:SSL错误:未知协议,期望从服务器接收身份验证请求,但收到S”。 - Rodrigo
1
端口22是SSH,与Postgres没有任何关系。 - Marc B
请按照以下步骤操作:https://dev59.com/-lgQ5IYBdhLWcg3wazIi#74163070 - abdulalim
19个回答

138

您需要编辑 postgresql.conf 文件并更改带有“listen_addresses”的行。

您可以在/etc/postgresql/9.3/main目录中找到此文件。

默认的Ubuntu配置仅允许本地主机(或127.0.0.1)接口,这足以在每个PostgreSQL客户端都在同一台计算机上作为PostgreSQL服务器时使用。如果您想从其他计算机连接PostgreSQL服务器,则必须按以下方式更改此配置行:

listen_addresses = '*'

然后您需要编辑 pg_hba.conf 文件。在该文件中,您需要设置哪些计算机可以连接到此服务器以及您可以使用哪种身份验证方法。通常情况下,您需要类似的行:

host    all         all         192.168.1.0/24        md5

请阅读此文件中的注释...
编辑:
编辑完postgresql.confpg_hba.conf后,必须重新启动postgresql服务器:sudo service postgresql restart 编辑2:突出显示配置文件。

3
192.168.1.0是网络地址,/24不是端口号,而是网络掩码长度(255.255.255.0)的位数。换句话说,允许使用来自192.168.1.0/255.255.255.0网络的计算机,其地址范围为192.168.1.1到192.168.1.254。 - Jan Marek
7
@ScottSkiles 的意思是将单个 IP 地址设为 192.168.1.1/32。 - Foreever
1
你在说哪个文件?至少有5个配置文件。 - Soren
@Sören 在我的回答中,你可以找到至少两个文件需要更改。 - Jan Marek
你解释得很正确,但我还是犯了一些常见的错误,我在这里发了出来。。https://stackoverflow.com/a/61182904/1005741 - hriziya
显示剩余6条评论

43

在postgresql.conf中取消注释listen_addresses = '*'。

这个问题已经困扰我两次了,所以我认为值得提一下。postgresql.conf文件中的listen_addresses = '*'默认情况下是被注释掉的。在更新后一定要取消注释(删除开头的#号)它,否则远程连接将继续被阻塞。

PS:psql -U postgres -c 'SHOW config_file' - 查找postgresql.conf文件路径。


12

以下是采纳答案的摘要:

如果你像我一样忽略了必须编辑的文件名

在我的情况下,配置文件位于

/etc/postgresql/14/main'

如果您键入cd /etc/postgresql/14/main

所以只需用sudo nano 添加这两个文件名

  1. postgresql.conf

listen_addresses = '*'

取消注释此行并将localhost更改为*

  1. pg_hba.conf

host all all 0.0.0.0/0

将127.0.0.1/32更改为0.0.0.0/0

最后别忘了使用sudo service postgresql restart重新启动

希望这篇文章能够澄清通知错误


无法解决我的连接被拒绝的问题... - Pfinnn
你在指定IP后使用了md5吗? - Jose Luis Landivar S
这将允许来自任何地方的连接,我不建议在pg_hba.conf中允许所有连接。 - Darryl Morley
点赞提醒我重启服务...! - WobbleMeister

9

请记得检查防火墙设置。在反复检查了我的pg_hba.confpostgres.conf文件之后,我终于发现我的防火墙覆盖了一切,因此阻止了连接。


1
你的解决方案对我有用。我运行了 sudo ufw status 命令并发现我的防火墙阻止了与端口5432的连接,因为它不在允许的端口列表中。要解决此问题,请运行 sudo ufw allow 5432/tcp 命令。 - Seunope

8

我曾经遇到过使用命令行连接psql和pgAdmin无法连接AWS上的RDS的问题。我确保我的RDS设置为公共访问。我确保我的ACL和安全组是完全开放的,但仍然存在问题,所以我采取了以下措施:

sudo find . -name *.conf

然后执行:

sudo nano ./data/pg_hba.conf

在pg_hba.conf文件的指令顶部添加以下内容:

host all all 0.0.0.0/0 md5

这样pgAdmin就能自动登录了。

以下内容也可以在pg_hba.conf文件中生效:

host all all md5

不带任何IP地址;或者使用我的IP地址:

host all all <myip>/32 md5

另外,我的RDS位于默认VPC中。我在非默认VPC中有一个完全相同的RDS实例,其安全组、ACL和安全组设置与默认VPC相同,但我无法使其正常工作。不确定原因,留待以后解决。


8

您需要编辑pg_hba.conf,以接受网络内的所有请求。

#TYPE  DATABASE        USER            ADDRESS                 METHOD 
host    all             all             0.0.0.0/0                md5
host    all             all             ::1/128                  md5

从您的应用程序中,您可以像下面的示例一样使用此IP地址进行连接:

postgresql://postgres:******@192.168.1.101:5432/app


3

您可能需要打开端口以便在您的局域网内(或者外部)访问它,或者将网络地址绑定到该端口上(使PostgreSQL能够在您的局域网上进行监听而不仅仅是在本地主机上)。


抱歉,作为一名终身PC开发者,我并不完全熟悉这个端口的事情。现在我只需要在我们的局域网内访问它(一个基于代理的机构网络)。您留言的其余部分对我来说是无法理解的。请参见其他评论。 - Rodrigo
1
Jan Marek的回答应该是你要找的。tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 这一行显示Postgre只监听来自运行Postgre的同一台计算机的连接,而不是来自本地网络的连接。 - Daniel Kravetz Malabud
好的。但你们怎么知道所选行是关于Postgres的呢?因为5432是它们的默认端口号? - Rodrigo
1
正确。它只显示了两个端口,22是SSH的默认端口,你已经提到你正在使用SSH,并且5432是Postgres的默认端口,你也提到你正在使用并遇到问题。 - Daniel Kravetz Malabud

3

如果出现错误,首要的事情是阅读日志。

  • 仅适用于通过Brew在您的Mac上安装postgresql *

首先,您需要通过运行 brew services 来检查postgresql状态。

如果停止了,请尝试启动它,然后再次运行 brew services

如果状态显示错误,您可以通过*.plist文件轻松找到日志位置。

例如,在我的配置中

cat /Users/drosanda/Library/LaunchAgents/homebrew.mxcl.postgresql@12.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>homebrew.mxcl.postgresql@12</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/opt/postgresql@12/bin/postgres</string>
        <string>-D</string>
        <string>/usr/local/var/postgresql@12</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/usr/local/var/log/postgresql@12.log</string>
    <key>StandardOutPath</key>
    <string>/usr/local/var/log/postgresql@12.log</string>
    <key>WorkingDirectory</key>
    <string>/usr/local</string>
</dict>
</plist>

以下是日志文件内容:

2021-11-30 09:07:20.154 WIB [3891] FATAL: lock file "postmaster.pid" already exists

2021-11-30 09:07:20.154 WIB [3891] HINT: Is another postmaster (PID 422) running in data directory "/usr/local/var/postgresql@12"?

在我的情况下,由于 PID 文件仍然存在,postgresql 无法启动。

很容易解决,只需删除 postmaster.pid 文件即可。

这个答案可能对以后的某些人有用。


2

我在MacOS系统升级后遇到了同样的问题。通过使用brew升级postgres解决了这个问题。 详情:看起来系统试图使用旧的Postgres 10设置访问Postgres 11。我相信这是我过去某个地方犯的错误,但幸运的是通过上述升级解决了所有问题。


2

为另一个可能性添加更新的答案。在AWS EC2上运行Postgres 10时,我需要通过Windows Defender防火墙添加自定义入站规则以允许端口5432。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接