我有一个Google Cloud PostgreSQL实例。在GCP的“连接”选项卡中将它们列入白名单之后,我可以通过几个本地IP地址连接到它。我开发了应用程序,现在,当我尝试从生产Web服务器连接实例时,它说:
致命错误:未捕获的PDOException:SQLSTATE [08006] [7]无法连接到服务器:连接超时服务器是否在主机“ 34.65.215.xx”上运行并接受端口5432上的TCP / IP连接?
我正在使用的PHP是:
$wpdb2 = new PDO('pgsql:host=34.65.215.xx;port=5432;dbname=xxxxx', 'postgres', 'xxxxxx');
我写信给Web服务器支持,他们通过在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
我只是不知道下一步该怎么做...
有人可以帮助理解吗?
答案 0 :(得分:0)
如果我的理解是正确的:
在GCP的“连接”标签中将它们列入白名单之后,我可以通过几个本地IP地址连接到它
您是否已将Web服务器主机IP添加到Cloud SQL IP白名单中?
建议
您是否考虑过在GCP上运行工作负载?以AppEngine为例。您将能够强制执行安全性。
因为在此设计中,这实际上不是一个好习惯,并且安全级别很低。
后端服务器和数据库之间的延迟可能也是一个问题。
答案 1 :(得分:0)
检查以确保您的实例的当前IP地址已列入白名单。 IP地址可以定期更改。您可以通过访问https://whatismyipaddress.com/之类的工具来检查您的公共IP。
如果您想要一种更安全的连接方式而不必将IP列入白名单,请考虑使用Cloud SQL Proxy。
答案 2 :(得分:0)
按照所有人的建议,您可以检查Web服务器的公共IP地址。要知道它,您可以使用@kurtisvg提供的网页,也可以使用Linux终端上的网页:
$ curl ifconfig.co
此外,如果您的网络服务器操作系统是Red Hat或任何分支(CentOS,Scientific Linux等),则应配置SELinux布尔值httpd_can_network_connect_db
更改为1
,以将PHP应用程序连接到该数据库中的任何数据库另一台服务器。
$ sudo setsebool -P httpd_can_network_connect_db 1
现在一切都应该正常工作,因此请尝试将您的PHP应用程序再次连接到Cloud SQL实例。