Google Cloud PostgreSQL 无法从服务器连接

Google Cloud PostgreSQL can't connect from server

我有一个 Google Cloud PostgreSQL 实例。在 GCP 的连接选项卡中将它们列入白名单后,我可以通过几个本地 IP 地址连接到它。我开发了我的应用程序,现在,当我尝试从生产网络服务器连接实例时,它显示:

Fatal error: Uncaught PDOException: SQLSTATE[08006] [7] could not connect to server: Connection timed out Is the server running on host "34.65.215.xx" and accepting TCP/IP connections on port 5432?

我正在使用的 PHP 是:

$wpdb2 = new PDO('pgsql:host=34.65.215.xx;port=5432;dbname=xxxxx', 'postgres', 'xxxxxx');

我写信给我的网络服务器支持,他们通过在 34.65.215.xx IP 上的输出中打开 5432 端口来回答我。之后我仍然无法连接到实例。

strace 说:

0.000120 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 4
0.000043 setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4) = 0
0.000031 fcntl(4, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
0.000024 fcntl(4, F_SETFD, FD_CLOEXEC) = 0
0.000027 connect(4, {sa_family=AF_INET, sin_port=htons(5432), sin_addr=inet_addr("34.65.215.xx")}, 16) = -1 EINPROGRESS (Operation now in progress)
0.000112 poll([{fd=4, events=POLLOUT|POLLERR}], 1, 30000) = 1 ([{fd=4, revents=POLLOUT|POLLERR|POLLHUP}])
15.270417 getsockopt(4, SOL_SOCKET, SO_ERROR, [110], [4]) = 0
0.000103 close(4) = 0

我只是不知道接下来要做什么...

谁能帮忙理解一下?

如果我的理解是正确的:

  • 您在 public IP 34.65 上有一个 Cloud SQL 实例。215.xx
  • 您在 GCP 外部托管的网络服务器上有一个 PHP 脚本 运行

I can connect to it by several local IP addresses, after having whitelisted them in the connections tab on GCP

您是否在云中添加了您的网络服务器主机 IP SQL IP 白名单?

建议

您是否考虑过 运行 您在 GCP 上的工作量?以应用引擎为例。您将能够实施安全措施。

因为在这个设计中,这并不是一个好的做法,而且安全级别很低。

后端服务器和数据库之间的延迟也可能是一个问题。

检查以确保您当前的 IP 地址已列入您的实例的白名单。 IP 地址可以定期更改。您可以通过访问像 https://whatismyipaddress.com/.

这样的工具来检查您的 public ip

如果您想要一种更安全的连接方式而无需将您的 IP 列入白名单,请考虑使用 Cloud SQL Proxy

正如大家所建议的,您可以检查您的网络服务器的 public IP 地址。要了解它,您可以使用@kurtisvg 提供的网页或 linux 终端,您可以使用此:

$ curl ifconfig.co

此外,如果您的网络服务器 OS 是 Red Hat 或任何分支(CentOS、Scientific Linux 等),您应该配置 SELinux boolean httpd_can_network_connect_db 将其更改为 1 以将您的 PHP 应用程序连接到另一台服务器中的任何数据库。

$ sudo setsebool -P httpd_can_network_connect_db 1

现在一切正常,所以请再次尝试将您的 PHP 应用程序连接到您的 Cloud SQL 实例。