问题描述
我正在尝试使用以下命令连接到安装在远程服务器中的postgres数据库:
psql -h host_ip
-U db_username
-d db_name
这发生的错误:
psql: could not connect to server: Connection refused Is the server running on host “” and accepting TCP/IP connections on port 5432?
-
Postgres的安装版本是9.4。
-
主机操作系统:Ubuntu 15.04
-
客户端操作系统:Centos 7
我已经尝试了以下方法,但问题仍未解决:
-
编辑了
pg_hba.conf
文件以包括
host all all 0.0.0.0/0 md5
-
编辑了’postgresql.conf’并将监听参数更改为
listen_addresses=’*’
-
重新启动postgres服务。
-
在主机和客户端上禁用防火墙和iptables。
-
我通过在本地运行psql命令进行了检查,它是否有效。
-
我尝试了此question中提供的第二个解决方案。运行
nmap
给我以下输出:
Starting Nmap 6.47 ( http://nmap.org ) at 2015-09-07 18:08 IST
Nmap scan report for 10.17.250.250
Host is up (0.0000040s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
80/tcp open http
我错过了什么吗?希望有人能帮忙。
最佳思路
cd /etc/postgresql/9.x/main/
打开名为postgresql.conf
的文件
sudo vi postgresql.conf
将此行添加到该文件
listen_addresses = '*'
然后打开名为pg_hba.conf
的文件
sudo vi pg_hba.conf
并将此行添加到该文件
host all all 0.0.0.0/0 md5
它允许使用加密密码的所有用户访问所有数据库
重新启动服务器
sudo /etc/init.d/postgresql restart
次佳思路
检查postgresql.conf
中定义的端口。我的postgres 9.4安装使用端口5433
而不是5432
第三种思路
在尝试远程连接到Raspberry Pi上的新PostgreSQL安装时,我为此感到困惑。这是我为解决此问题所做的全部工作:
首先,打开PostgreSQL配置文件,并确保该服务将在localhost之外进行侦听。
sudo [editor] /etc/postgresql/[version]/main/postgresql.conf
我使用了nano
,但是您可以使用自己选择的编辑器,尽管我安装了9.1
版本,但是该目录将适合您所安装的版本。
向下搜索标题为“连接和身份验证”的部分。第一个设置应该是'listen_addresses'
,并且可能看起来像这样:
#listen_addresses = 'localhost' # what IP address(es) to listen on;
右侧的注释为如何更改此字段提供了很好的说明,并且对所有字段使用建议的'*'
都可以很好地工作。
请注意,该字段用#注释掉。根据注释,它将默认为’localhost’,因此仅将值更改为'*'
是不够的,您还需要通过删除开头的#
取消注释该设置。
现在看起来应该像这样:
listen_addresses = '*' # what IP address(es) to listen on;
您还可以检查下一个设置’port’,以确保连接正确。默认值为5432,并且是未指定psql尝试连接的端口。
保存并关闭文件,然后打开同一目录中的“客户端身份验证”配置文件:
sudo [editor] /etc/postgresql/[version]/main/pg_hba.conf
如果您想限制访问,我建议您阅读文件,但是对于基本的打开连接,您将跳至文件底部并添加如下一行:
host all all all md5
如果愿意,可以按Tab键而不是空格键以将字段与现有列对齐。
就我个人而言,我改为添加了如下所示的行:
host [database_name] pi 192.168.1.0/24 md5
这将连接限制为仅一个用户和局域网上的一个数据库。
将更改保存到文件后,您将需要重新启动服务以实施更改。
sudo service postgresql restart
现在,您可以使用以下命令检查服务,以确保该服务正在正确的端口上公开侦听:
sudo netstat -ltpn
如果您没有以提升的身份运行它(使用sudo
),它不会告诉您在这些端口上侦听的进程的名称。
进程之一应该是Postgres,本地地址应该是开放的(0.0.0.0),而不仅限于本地流量(127.0.0.1)。如果未打开,则需要仔细检查配置文件并重新启动服务。您可以再次确认该服务正在正确的端口上侦听(默认为5432
,但您的配置可能有所不同)。
最后,您将能够使用以下命令从远程计算机成功连接:
psql -h [server ip address] -p [port number, optional if 5432] -U [postgres user name] [database name]
第四种思路
确保在配置文件中正确应用了设置。
vim /etc/postgresql/x.x/main/postgresql.conf
尝试以下操作以查看日志并查找问题。
tail /var/log/postgresql/postgresql-x.x-main.log