【问题标题】:Unable to connect to Postgres on EC2: ECONNREFUSED无法连接到 EC2 上的 Postgres:ECONNREFUSED
【发布时间】:2016-12-14 16:34:21
【问题描述】:

我有一个托管在 EC2 实例上的节点服务器,它试图连接到在同一实例上运行的 Postgres。当我启动服务器时,我收到一个 ECONNREFUSED 错误到数据库:

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,这意味着该端口是可访问的,但没有应用程序在监听它以响应数据包。

感谢任何帮助使连接正常工作。

【问题讨论】:

    标签: node.js postgresql amazon-web-services amazon-ec2 sequelize.js


    【解决方案1】:

    是什么让您认为 netstat 表明 postgres 正在侦听端口?如果是这样,您会在 PID/程序列中看到一些内容。

    另外,如果您的 postgres 服务器与您的节点应用程序在同一个机器上运行,则您不需要通过 AWS 安全规则打开到 Internet 的端口,除非您需要从别处。然后你可以改变你的连接字符串来访问 localhost 或 127.0.0.1

    最后,通过docs 验证您是否已正确设置您的 postgres 服务器

    【讨论】:

    • 好点 - 奇怪的是 postgres 没有显示在程序名称列中。但是由于默认 postgres 端口上有一个进程,并且由于上述将公共 IP 更改为 localhost 的修复似乎已经奏效,所以未命名的进程似乎确实适用于 postgres
    【解决方案2】:

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

    如果您尝试从 VPC 中的另一台服务器进行连接,您可能希望使用私有 IP 进行连接。但是,由于它在同一个实例上,您可以删除安全组规则并只使用localhost127.0.0.1

    【讨论】:

    • 就是这样,谢谢。 FWIW 'localhost' 工作但不是 127.0.0.1
    猜你喜欢
    • 2018-01-19
    • 2012-11-01
    • 2019-06-15
    • 2020-04-19
    • 2019-07-21
    • 2018-02-01
    • 2014-03-31
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多