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

时间:2019-03-14 02:41:04

标签: django postgresql amazon-web-services amazon-ec2

我在同一VPC中的两个EC2实例上设置了Django应用程序和PostgreSQL数据库。应用程序位于实例上,且子网连接到Internet网关;数据库位于具有没有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

3 个答案:

答案 0 :(得分:1)

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

那是您的问题,您的postgres仅绑定到本地主机。

通过编辑/var/lib/pgsql/data/postgresql.conf或/ etc / postgresql /“此处的版本号” /main/postgresql.conf文件来更改postgres正在侦听的IP,并将侦听地址更改为跟随...

listen_addresses='127.0.0.1 10.0.1.136'

在Postgres的更高版本中,您必须像我一样声明监听地址,而没有逗号

我希望这可以解决您的问题! :)

答案 1 :(得分:1)

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

我运行了cls_DataSet class Public Sub AppendTrace,发现我的Postgres实际上在端口1823(WHY)上运行。我编辑了.copy以允许所有sudo netstat -plunt |grep postgrespostgresql.conf),然后将Django数据库设置更改为端口1823

答案 2 :(得分:0)

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