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