0

我有一个节点服务器托管在EC2实例上,它试图连接到运行在同一实例上的Postgres。当我启动服务器,我得到一个ECONNREFUSED错误的分贝:无法连接到EC2上的Postgres:ECONNREFUSED

Unable to connect to the database: SequelizeConnectionRefusedError: connect ECONNREFUSED x.x.x.x:5432

我使用Sequelize ORM包从NPM:

import Sequelize from 'sequelize'; 
const db = new Sequelize('postgres://[email protected]/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,这意味着该端口是可访问的,但没有监听应用程序的应用程序能够响应数据包。

感谢获得连接工作的任何帮助。

回答

1

一个问题是您正在使用公共IP地址。这意味着您的数据库连接基本上会通过互联网返回。这将阻止安全组规则运行,并引入安全性和延迟问题。

如果您尝试从VPC中的其他服务器进行连接,则需要使用专用IP进行连接。但是,由于它在同一个实例上,因此您可以删除安全组规则并仅使用localhost127.0.0.1

+0

这是它,谢谢正确已经设置你的Postgres服务器。 FWIW'localhost'工作,但不是127.0.0.1 – aeb0

0

是什么让你觉得netstat显示postgres正在监听端口?如果是,你会在PID/Program列中看到一些东西。另外,如果您的postgres服务器与您的节点应用程序在同一个框中运行,则不需要通过您的AWS安全规则将端口打开到互联网,并且可能不应该除非您需要访问它从其他地方。然后你就可以改变你的连接字符串打本地主机或127.0.0.1

最后,请确认您通过docs

+0

好点 - 它是不可思议的,postgres不显示在程序名称列。但是由于在默认的postgres端口上有一个进程,并且由于将公共IP更改为本地主机的上述修复似乎已经起作用,所以未命名的进程看起来似乎适用于postgres – aeb0