我在EC2实例上托管了一个Node服务器,该实例尝试连接到在同一个实例上运行的Postgres。当我启动服务器时,我得到一个ECONNREFUSED错误到db:
Unable to connect to the database: SequelizeConnectionRefusedError: connect ECONNREFUSED x.x.x.x:5432
我正在使用NPM的Sequelize ORM包:
import Sequelize from 'sequelize';
const db = new Sequelize('postgres://postgres@52.9.136.53/unloadx' {dialect: 'postgres'});
Postgres正在实例上运行,我在入站安全规则中打开了端口5432。我可以确认postgres正在运行ps aux | grep postgres
,显示多个与postgres相关的进程,netstat -anp --tcp
确认postgres似乎正在侦听端口:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 ::1:5432 :::* LISTEN -
但是当我用nmap x.x.x.x -p 5432
扫描端口时,它显示端口状态已关闭。根据nmap,这意味着该端口是可访问的,但没有应用程序监听它能够响应数据包。
感谢任何有助于连接工作的帮助。
答案 0 :(得分:1)
一个问题是您使用的是公共IP地址。这意味着您的数据库连接基本上是上网并返回。这将阻止安全组规则工作,并引入安全性和延迟问题。
如果您尝试从VPC中的其他服务器进行连接,则需要使用专用IP进行连接。但是,由于它位于同一实例上,因此您可以删除安全组规则,只需使用localhost
或127.0.0.1
。
答案 1 :(得分:0)
是什么让你认为netstat
表明postgres正在监听端口?如果是,您可以在PID /程序列中看到一些内容。
此外,如果您的postgres服务器与您的节点应用程序在同一个盒子上运行,您不需要通过AWS安全规则打开到Internet的端口,除非您需要访问,否则可能不应该来自其他地方。然后,您可以将连接字符串更改为localhost或127.0.0.1
最后,确认您已通过docs
正确设置了postgres服务器