Nginx 反向代理搞乱了 PostgreSQL 实例的请求

问题描述 投票:0回答:1

我在 Amazon VPC 的私有子网上有一个 PostgreSQL RDS 实例。我正在使用同一 VPC 中公有子网上的实例来反向代理对私有子网上的 EC2 和 RDS 实例的请求。

反向代理与 HTTP 到 EC2 实例配合良好。但是,我无法通过反向代理连接到 RDS 实例。

我可以使用

psql
从公有子网上的 EC2 实例连接到 RDS。但是,如果我反向代理,我会收到此错误:

> psql --host=PUBLIC_IP --port=5432
psql: received invalid response to SSL negotiation: H

nginx access log: 
[PUBLIC_IP] - - [17/Apr/2018:10:51:45 +0000] "\x00\x00\x00\x08\x04\xD2\x16/" 400 174 "-" "-" "-"

如果我尝试另一个 HTTP 端口,我会得到同样的错误:

> psql --host=[PUBLIC_IP] --port=80
psql: received invalid response to SSL negotiation: H

nginx access log: 
[PUBLIC_IP] - - [17/Apr/2018:10:51:45 +0000] "\x00\x00\x00\x08\x04\xD2\x16/" 400 174 "-" "-" "-"

如果我从公共 EC2 实例尝试

localhost
,我也会遇到同样的错误:

> psql --host=localhost --port=5432 
psql: received invalid response to SSL negotiation: H

nginx access log: 
[PUBLIC_IP] - - [17/Apr/2018:10:51:45 +0000] "\x00\x00\x00\x08\x04\xD2\x16/" 400 174 "-" "-" "-"

但是,从公共 EC2 实例直接连接到私有子网中的 RDS 效果很好:

> psql --host=postgis-database.REDACTED.eu-central-1.rds.amazonaws.com --port=5432
Password:

那么 nginx 搞乱连接并转发错误的标头或 IP 之类的东西似乎是合理的?

这个问题的修复或解决方法是什么?如何通过nginx转发完全相同的连接内容?这可能是由于 nginx 附加的连接“关闭”所致吗?

postgresql nginx reverse-proxy amazon-rds
1个回答
0
投票

Nginx 不理解 PostgreSQL 握手。我们必须解决这个确切的问题,并且我们开源了解决方案,

https://hub.docker.com/r/ambarltd/pgt-proxy

© www.soinside.com 2019 - 2024. All rights reserved.