我在同一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
答案 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 postgres
(postgresql.conf
),然后将Django数据库设置更改为端口1823
答案 2 :(得分:0)
正如您提到的,数据库位于EC2实例中,请检查实例的入站规则。看到入站规则的图像。源应该是实例ip上的0.0.0.0/0,::/0