我在 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 附加的连接“关闭”所致吗?
Nginx 不理解 PostgreSQL 握手。我们必须解决这个确切的问题,并且我们开源了解决方案,