从云 运行 PHP 连接到 Google Cloud Compute Engine VM 上的 MySQL 实例

Connect to MySQL instance on Google Cloud Compute Engine VM from Cloud Run PHP

我正在努力从 Google 云 运行 容器中托管的基于 PHP 的网站连接到 Google 上的 MySQL 数据库云计算引擎虚拟机。

最近,我在 Google 云 运行 环境中的容器内成功地建立了一个基于 PHP 的网站。我还设置了一个 Cloud SQL 实例,并且可以轻松地从 PHP 网站连接到 Cloud SQL 实例。

我发现云 SQL 服务比我计划的要贵很多,所以在 Compute Engine VM 上设置了 MySQL 运行 的实例。

MySQL 实例是 运行,我可以通过 VM 实例上的 SSH 访问数据库。配置文件为:

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
bind-address    = 0.0.0.0

我正在使用 0.0.0.0 的绑定地址来允许来自我的开发机器的连接,因为使用更新的配置字符串构建容器相当乏味。

我用来连接云 SQL 实例的连接字符串是:

define('HOSTSPEC', NULL);
define('USERNAME', '<username>');
define('PASSWORD', '<password>');
define('DATABASE_INSTANCE_NAME', NULL); // Or the name of a database instance within your Cloud SQL instance.
define('PORT', NULL);
define('SOCKET', '/cloudsql/<project-name>:<instance-region>:<instance-name>');

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

try {
    $mysqli = new mysqli(HOSTSPEC, USERNAME, PASSWORD, DATABASE_INSTANCE_NAME, PORT, SOCKET);
...

我找不到任何资源来建议托管在 Compute Engine VM 中的 MySQL 的连接字符串应该是什么!

我确实尝试了我用于我的开发机器的连接字符串,将本地主机的 IP 地址替换为 VM 的外部 IP 地址,但无济于事:

$server = 'XXX.XXX.XXX.XXX';
$username   = '<username>';
$password   = '<password>';
$database   = '<database>';

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

try {
    $mysqli = new mysqli($server, $username,  $password, $database);
...

我监控了 /var/log/mysql/error.log,但没有看到任何连接失败,这表明我没有连接到服务器。

到目前为止,我已经浏览了以下链接,但还没有找到我正在寻找的答案:

Add a new firewall rule

Remote connections mysql ubuntu find address failed

Set-up MySQL (note: I was unable to complete these steps as I couldn't install MySQL as outlined, so I followed MySQL package MySQL server has no installation candidate

我无法执行以下 gcloud 命令: gcloud config set project <project-name> 当我收到错误时:You do not appear to have access to project [<project name>] or it does not exist. 虽然这个项目确实存在并且我可以在云 运行 环境中访问它(并成功执行该命令)我的 PHP-基于网站托管。

对下一步尝试有什么建议吗?

当然,我可以放弃并在 VM 中构建基于 PHP 的网站,然后访问 MySQL 数据库 'locally',但已经弄清楚如何部署云中容器中的服务 运行,我想将网站保留在那里。

按照@alan 的建议,我尝试从我的开发机器上的终端连接到 MySQL 实例。

这表明虚拟机上的端口 3306 未打开。

我按照 this link 中的说明在 VM 上打开了端口 3306。

然后,我收到了ERROR 1130 (HY000): Host '<development machine IP address>' is not allowed to connect to this MySQL server

然后我将我的开发机器 IP 地址添加到 CREATE USER 和 GRANT USER 语句中,例如:

CREATE USER IF NOT EXISTS '<username>'@'localhost' IDENTIFIED WITH mysql_native_password BY '<password>';
CREATE USER IF NOT EXISTS '<username>'@'XXX.XXX.XXX.XXX' IDENTIFIED WITH mysql_native_password BY '<password>';
GRANT SELECT, INSERT, UPDATE ON <database>.<table> TO '<username>'@'localhost';
GRANT SELECT, INSERT, UPDATE ON <database>.<table> TO '<username>'@'XXX.XXX.XXX.XXX';

从云 运行 服务连接到 VM 的连接字符串是:

$server = 'XXX.XXX.XXX.XXX';
$username   = '<username>';
$password   = '<password>';
$database   = '<database>';

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

try {
    $mysqli = new mysqli($server, $username,  $password, $database);
...

我起床了 运行!