【问题标题】:Error connecting to Google Cloud SQL from App Engine custom environment using TCP使用 TCP 从 App Engine 自定义环境连接到 Google Cloud SQL 时出错
【发布时间】:2019-03-11 14:04:09
【问题描述】:

我正在尝试从 App Engine 中的自定义运行时环境连接到 google sql 云实例。

当我按照doc 使用 unix 域套接字进行连接时,它可以工作。问题是当我尝试使用 TCP 连接进行连接时。它显示:

Warning: mysqli_connect(): (HY000/2002): Connection refused in 
/var/www/html/index.php on line 3
Connect error: Connection refused

这是我的 app.yaml 文件:

runtime: custom
env: flex

beta_settings:
  cloud_sql_instances: testing-mvalcam:europe-west1:testdb=tcp:3306

resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

Dockerfile:

FROM php:7.0-apache

ENV PORT 8080
CMD sed -i "s/80/$PORT/g" /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf && docker-php-entrypoint apache2-foreground

RUN docker-php-ext-install mysqli
RUN a2enmod rewrite

COPY ./src /var/www/html

EXPOSE $PORT

还有index.php:

<?php

$link = mysqli_connect('127.0.0.1', 'root', 'root', 'test');

if (!$link){
    die('Connect error: '. mysqli_connect_error());
}

echo 'successfully connected';
mysqli_close($link);

?>

我做错了什么?

【问题讨论】:

  • 您能解释一下您从哪里得到该错误消息,即通过 ssh 连接到运行 docker 进程的计算引擎,然后使用本地 IP 地址和您公开的端口发出 HTTP GET 请求?另外,您是否为您的项目启用了“Cloud SQL Admin API”(您可以通过console.cloud.google.com/apis/api/sqladmin.googleapis.com/… 进行检查)?
  • 当我访问项目 url 时,我确实直接得到了错误。 Index.php 加载,但与云 sql 的连接被拒绝。是的,我启用了 Cloud SQL Admin API。奇怪的是,当我使用 unix 套接字类型连接(到 /cloudsql/)时,它可以工作。只有当我尝试使用 TCP 连接时才会收到此错误。
  • 好的,如果您可以通过 ssh 连接到与 App Engine 应用程序关联的 Compute Engine vm 实例之一(您可以在 Google Cloud Console 的 App Engine 菜单的实例部分中看到它们),并且运行命令“netstat -tln”。在输出中检查“local_ip_address:8080”并在 index.php 中插入“local_ip_address”作为 mysqli_connect 调用的第一个参数,而不是“127.0.01”。
  • 没错!!,这就是问题所在。当我 ssh 到实例并运行“netstat -tln”时,我得到了暴露的 ip,例如:172.17.0.1:3306 和 172.17.0.1:8080。我不明白。为什么会这样?。无论如何,官方文档是不正确的。其中,清楚地表明您必须指向 localhost 才能连接到云 sql 实例。如果你愿意,写一个答案,以便能够给你打分并标记为有效答案。谢谢!。

标签: google-app-engine google-cloud-platform google-cloud-sql


【解决方案1】:

IP 地址“172.17.0.1”与运行 webserver 的 docker 容器有关,您可以在 in this documentation 上获得更多上下文。

如果您在存在 Dockerfile 的情况下进行部署,您使用的文档页面可能缺少调整用例。在下面的documentation 中,您可以阅读有关 App Engine 灵活运行时的更多信息。

【讨论】:

    【解决方案2】:

    正如您正在使用的documentation 所示(请记住单击此页面上的 TCP CONNECTION 选项卡),在 app.yaml 的与 Cloud SQL 实例相关的部分中,有关正在使用的 TCP 端口的信息需要数据库服务器。

    【讨论】:

    • 是的,抱歉。这是我之前使用的 socked conf。使用此 cloud_sql_instances 参数,它显示相同的结果。我修复了原来的问题
    猜你喜欢
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    相关资源
    最近更新 更多