EC2 上的 PostgreSQL 数据库:连接被拒绝

Posted

技术标签:

【中文标题】EC2 上的 PostgreSQL 数据库:连接被拒绝【英文标题】:PostgreSQL database on EC2: Connection refused 【发布时间】:2019-08-04 20:29:43 【问题描述】:

我在同一个 VPC 中的两个 EC2 实例上设置了我的 Django 应用程序和 PostgreSQL 数据库。应用程序在子网连接到互联网网关的实例上;数据库位于具有没有 Internet 网关的子网的实例上。

应用实例的私有IP是10.0.0.164;数据库实例的私有 IP 是 10.0.1.136。

当我尝试将我的 Django 应用程序连接到数据库时,出现错误

无法连接到服务器:连接被拒绝 服务器是否正在运行 在主机“10.0.1.136”上并接受端口 5432 上的 TCP/IP 连接?

但是,我已允许数据库实例上端口 5432 上的入站 TCP 流量。我托管数据库的实例的安全组规则:

入站:允许来自托管 Django 应用程序的实例的内部 IP 地址 (10.0.0.164/32) 的所有端口中的所有 TCP 和 ICMP IPV4&IPV6 流量

(我的入站规则截图https://imgur.com/a/HNbrIDm)

出站:允许所有端口中的所有流量到任何地方

我在数据库 EC2 实例上的 pg_hba.conf 文件:

# Database administrative login by Unix domain socket
local   all             postgres                                md5

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all             all             10.0.0.164/32           trust
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   articles        postgres                                md5
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

我的postgresql.conf 文件已将监听地址设置为“10.0.0.164, 127.0.0.1”并将端口设置为“5432”。

我在Django的settings.py中的数据库设置:

ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'articles',
            'USER': 'postgres',
            'PASSWORD': 'password',
            'HOST': '10.0.1.136',
            'PORT': '5432',

我还能做些什么来让数据库实例接受连接?

编辑:我的 EC2 实例正在运行 Ubuntu 16.04

编辑:这是我在数据库实例上运行 sudo lsof -nP -i | grep LISTEN 得到的结果:postgres 1823 postgres 6u IPv4 19766 0t0 TCP 127.0.0.1:5432 (LISTEN)

我跑了sudo ufw allow 5432 还是同样的错误

当我在数据库实例上运行 netstat -nlt 时,我没有看到端口 5432

【问题讨论】:

您使用的是哪个 Linux 发行版?确保在操作系统防火墙上允许端口 5432。例如,在 Ubuntu 中,您必须执行 sudo ufw allow 5432 @Pedro Ubuntu 16.04。感谢您提醒我包含该信息!我会试试那个命令 @Pedro 你的意思是我必须对数据库实例或应用程序实例执行sudo ufw allow 5432 吗? 只是为了明确您的数据库是一个 EC2 实例,对吗?不是 RDS @Pedro 是 EC2,不是 RDS 【参考方案1】:

postgres 1823 postgres 6u IPv4 19766 0t0 TCP 127.0.0.1:5432 (LISTEN)

那是你的问题,你的 postgres 只绑定到本地主机。

通过编辑 /var/lib/pgsql/data/postgresql.conf 或 /etc/postgresql/"Version number here"/main/postgresql.conf 文件更改 postgres 正在侦听的 IP,并将侦听地址更改为跟随...

listen_addresses='127.0.0.1 10.0.1.136'

你必须像我在 postgres 的更高版本中那样声明监听地址

希望这能解决您的问题! :)

【讨论】:

是的,这就是问题所在!谢谢!刚刚发布了一个详细说明我如何解决问题的答案 很高兴我能帮上忙,我还注意到您在问题中说监听地址是 10.0.1.164,我假设这是 Django 应用程序的地址而不是数据库的地址?这可能是它只在本地主机上监听的原因:) 我也遇到了同样的问题。但我找不到 postgresql.conf 文件。在 Windows 中如何找到该文件?【参考方案2】:

这个页面解决了我的问题:https://zaiste.net/postgresql_allow_remote_connections/

我运行了sudo netstat -plunt |grep postgres,发现我的 Postgres 实际上在端口 1823 上运行(为什么)。我编辑了我的 postgresql.conf 以允许所有 listen_addresses (listen_addresses = '*') 然后将我的 Django 数据库设置更改为端口 1823

【讨论】:

【参考方案3】:

正如您提到的,您的数据库位于 EC2 实例中,请检查实例的入站规则。看到入站规则的图像。 Source 应该是 0.0.0.0/0,::/0 而不是实例 ip

【讨论】:

以上是关于EC2 上的 PostgreSQL 数据库:连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

将Rstudio与PostgreSQL在AWS EC2中连接

如何通过 Amazon EC2 将 postgresql 数据移动到 Ubuntu 上的另一个目录?

如何使用 NodeJS 从 EC2 连接和查询 PostgreSQL RDS?

连接到amazon ec2上的远程postgresql服务器

111:尝试连接到 AWS EC2 实例上的 Flask 应用程序时出现连接被拒绝错误

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