无法连接到 EC2 实例上运行的 PostgreSQL 数据库

Posted

技术标签:

【中文标题】无法连接到 EC2 实例上运行的 PostgreSQL 数据库【英文标题】:cannot connect to PostgreSQL DB running on EC2 instance 【发布时间】:2020-06-19 22:01:54 【问题描述】:

我有一个在 EC2 实例上运行的简单 PostgreSQL 数据库。

ubuntu@ip-172-31-38-xx:~$ service postgresql status
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since Fri 2020-06-19 14:04:12 UTC; 7h ago
 Main PID: 11065 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 1152)
   CGroup: /system.slice/postgresql.service

Jun 19 14:04:12 ip-172-31-38-xx systemd[1]: Starting PostgreSQL RDBMS...
Jun 19 14:04:12 ip-172-31-38-xx systemd[1]: Started PostgreSQL RDBMS.
ubuntu@ip-172-31-38-xx:~$ psql -U postgres
Password for user postgres:
psql (10.12 (Ubuntu 10.12-0ubuntu0.18.04.1))
Type "help" for help.

postgres=# SELECT *
postgres-# FROM pg_settings
postgres-# WHERE name = 'port';
 name | setting | unit |                       category                       |                short_desc                | extra_desc |  context   | vartype |       source       | min_val | max_val | enumvals | boot_val | reset_val |               sourcefile                | sourceline | pending_restart
------+---------+------+------------------------------------------------------+------------------------------------------+------------+------------+---------+--------------------+---------+---------+----------+----------+-----------+-----------------------------------------+------------+-----------------
 port | 5432    |      | Connections and Authentication / Connection Settings | Sets the TCP port the server listens on. |            | postmaster | integer | configuration file | 1       | 65535   |          | 5432     | 5432      | /etc/postgresql/10/main/postgresql.conf |         63 | f
(1 row)

与此 EC2 实例关联的唯一安全组具有完全开放的入站规则:

5432, TCP, 0.0.0.0/0

但是当我使用客户端连接到这个数据库并输入正确的主机名(公共 IP/DNS)、端口号、数据库名称、用户名和密码时,它总是说:

could not connect to server: Connection refused, is the server running on host "ec2-dns.com(172.public.ip)" and accepting TCP/IP connections on port 5432?

【问题讨论】:

您是否尝试连接到以 172.something 开头的 IP?那是内部 IP,而不是外部 IP。 不,我使用了它的公共 IP 和/或 DNS,没有运气。 【参考方案1】:

好吧,我已经从这个answer弄明白了

为了让自己能够连接,我做了两件事(完全来自上面的链接,为了方便,我在这里复制它):

    打开这个文件:sudo vi /etc/postgresql/10/main/pg_hba.conf

就在这条线的下方:

host all all 127.0.0.1/32 md5

添加了这一行:

host all all 0.0.0.0/0 md5

    打开这个文件:sudo vi /etc/postgresql/10/main/postgresql.conf

找到以此开头的一行: #listen_addresses = 'localhost'

通过删除 # 取消注释该行,并将 'localhost' 更改为 '*'。

该行现在应该如下所示:

listen_addresses = '*' # what IP address(es) to listen on;.

然后重启你的服务:

sudo service postgresql restart

那么您应该能够通过 SQL 客户端连接到您的数据库。

【讨论】:

虽然这个答案包括必要的步骤,但向所有地址开放是非常不安全的。 listen_addresses 不会影响要收听的地址,所以没关系,但是在 pg_hba.conf 中,您应该指定一个地址/范围。另外,pg_hba.conf 可以在不同的地方,参见here。【参考方案2】:

您确定 PostgreSQL 正在侦听您用作主机和端口参数的 IP 地址和端口号。尝试修改您的 postgresql.conf 文件并重新启动服务器。

   sudo nano /etc/postgresql/YOUR_POSTGRES_VERSION/main/postgresql.conf

现在继续查找连接设置并更新以下值。

   listen_addresses = YOUR_IP_ADDRESS
   port = YOUR_PORT_NUMBER

现在保存文件并重新启动 postgresl 服务器:

   sudo systemctl restart postgres

结帐文档 here:

【讨论】:

以上是关于无法连接到 EC2 实例上运行的 PostgreSQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sequelize 从 ec2 连接到 postgres RDS

无法连接到端口 8080 上的 EC2 Windows 实例

无法连接到 EC2 上的 cassandra 服务器?

Sqitch 无法连接到正在运行的 Postgres 实例

无法连接到 Nodejs EC2 服务器上的 SQL Server 数据库

为啥我无法从外部连接到 Kafka?