我创建了一个想要在线部署的应用程序。 该应用程序存储在目录
app
中,我还有另一个名为 nginx
的目录,其中包含一个 nginx 服务器,我将其用作反向代理来通过 HTTPS 部署应用程序。
我使用AWS EC2实例作为服务器,使用Postgres的RDS数据库来存储数据,这两个实例通过vpc连接,并且所有证券组都已创建。
为了部署应用程序,我决定使用 Docker 将应用程序容器化,创建两个容器,一个用于应用程序,一个用于 nginx 反向代理。使用 docker-compose up
,应用程序已正确构建,并且可以在 EC2 服务器上部署在线使用该站点。
当我尝试使用涉及应用程序与数据库通信的任何功能时,就会出现问题,我尝试记录数据库的响应并得到:
error: no pg_hba.conf entry for host "<EC2 Private IPv4>", user "masteruser", database "postgres", no encryption
nodeserver_1 | at Parser.parseErrorMessage (/usr/src/app/server/node_modules/pg-protocol/dist/parser.js:287:98)
nodeserver_1 | at Parser.handlePacket (/usr/src/app/server/node_modules/pg-protocol/dist/parser.js:126:29)
nodeserver_1 | at Parser.parse (/usr/src/app/server/node_modules/pg-protocol/dist/parser.js:39:38)
nodeserver_1 | at Socket.<anonymous> (/usr/src/app/server/node_modules/pg-protocol/dist/index.js:11:42)
nodeserver_1 | at Socket.emit (node:events:519:28)
nodeserver_1 | at addChunk (node:internal/streams/readable:559:12)
nodeserver_1 | at readableAddChunkPushByteMode (node:internal/streams/readable:510:3)
nodeserver_1 | at Readable.push (node:internal/streams/readable:390:5)
nodeserver_1 | at TCP.onStreamRead (node:internal/stream_base_commons:190:23) {
nodeserver_1 | length: 162,
nodeserver_1 | severity: 'FATAL',
nodeserver_1 | code: '28000',
nodeserver_1 | detail: undefined,
nodeserver_1 | hint: undefined,
nodeserver_1 | position: undefined,
nodeserver_1 | internalPosition: undefined,
nodeserver_1 | internalQuery: undefined,
nodeserver_1 | where: undefined,
nodeserver_1 | schema: undefined,
nodeserver_1 | table: undefined,
nodeserver_1 | column: undefined,
nodeserver_1 | dataType: undefined,
nodeserver_1 | constraint: undefined,
nodeserver_1 | file: 'auth.c',
nodeserver_1 | line: '543',
nodeserver_1 | routine: 'ClientAuthentication'
nodeserver_1 | }
我尝试将 IP 添加到 EC2 实例内的
pg_hba.conf
文件中(我不确定这是否有效,因为我要连接的数据库是一个独立实例),但没有任何改变,我尝试添加安全性组到 RDS 实例但没有任何效果。
当我尝试使用 shell 从 EC2 实例访问数据库时,发生了奇怪的事情,即使我在容器内使用它,我也可以使用
psql
命令连接到数据库。
因此,问题似乎仅在我尝试从应用程序客户端而不是终端使用数据库时出现。
不要使用 pg-protocol,使用 众所周知的 Javascript/Typescript PostgreSQL 驱动程序之一,例如 postgres.js 或 node-postgres。