在PHP应用开发中,远程连接GCP虚拟机上的MySQL数据库是很多项目的常见需求,整个过程需要同时配置GCP网络规则、MySQL服务权限和PHP连接参数,缺少任何一步都可能导致连接失败。

前置准备
首先需要确保你已经完成以下准备工作:
- 已经在GCP上创建好虚拟机实例,并且成功安装了MySQL服务
- 虚拟机的外部IP已经获取,并且可以正常通过SSH登录到虚拟机
- 本地或者部署PHP应用的服务器可以正常访问公网
第一步:配置GCP虚拟机防火墙规则
GCP默认会拦截外部对虚拟机非标准端口的访问,需要先开放MySQL的3306端口(如果修改过MySQL端口则开放对应端口)。
登录GCP控制台,进入虚拟机实例详情页,找到防火墙规则配置入口,添加一条入站规则:
- 协议:TCP
- 端口:3306
- 来源IP范围:填写你的PHP应用所在服务器的公网IP,如果要允许所有IP访问可以填0.0.0.0/0,但生产环境不建议这样配置
- 规则名称:自定义即可,比如mysql-remote-access
第二步:配置MySQL允许远程连接
默认情况下MySQL只允许本地连接,需要修改配置并授权用户远程访问权限。
修改MySQL绑定地址
登录到GCP虚拟机,编辑MySQL的配置文件,不同系统路径可能不同,常见路径为/etc/mysql/mysql.conf.d/mysqld.cnf或者/etc/my.cnf。
找到bind-address配置项,默认是127.0.0.1,将其修改为0.0.0.0,表示允许所有IP连接,修改后保存文件,重启MySQL服务:
# 重启MySQL服务,不同系统命令可能不同 sudo systemctl restart mysql
授权MySQL用户远程访问权限
登录到MySQL命令行,执行以下命令授权用户远程访问,假设你要使用的数据库用户是remote_user,密码是your_password,允许的访问IP是PHP应用服务器的公网IP,如果要允许所有IP可以替换为%:
-- 创建用户并授权,允许指定IP访问所有数据库 CREATE USER 'remote_user'@'PHP应用服务器公网IP' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'PHP应用服务器公网IP' WITH GRANT OPTION; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
第三步:编写PHP连接代码
完成前面的配置后,就可以编写PHP代码测试远程连接了,这里使用PDO扩展实现连接,兼容性更好。
<?php
// 配置连接参数
$dbHost = 'GCP虚拟机外部IP'; // 替换为你的GCP虚拟机外部IP
$dbPort = 3306; // MySQL端口,默认3306
$dbName = 'test_db'; // 要连接的数据库名,替换为实际数据库名
$dbUser = 'remote_user'; // 前面授权的MySQL用户名
$dbPass = 'your_password'; // 对应的密码
try {
// 创建PDO连接实例
$dsn = "mysql:host=$dbHost;port=$dbPort;dbname=$dbName;charset=utf8mb4";
$pdo = new PDO($dsn, $dbUser, $dbPass);
// 设置错误模式为异常,方便排查问题
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "PHP远程连接GCP虚拟机MySQL数据库成功";
// 测试查询示例
$stmt = $pdo->query("SELECT VERSION() as mysql_version");
$result = $stmt->fetch(PDO::FETCH_ASSOC);
echo "<br>MySQL版本:" . $result['mysql_version'];
} catch (PDOException $e) {
echo "连接失败:" . $e->getMessage();
}
?>常见连接问题排查
如果连接失败,可以按照以下步骤排查:
- 检查GCP防火墙规则是否生效,是否允许对应IP访问3306端口
- 检查MySQL的bind-address是否已经修改为0.0.0.0,并且服务已经重启
- 检查MySQL用户授权是否正确,是否允许当前PHP应用服务器的IP访问
- 检查PHP服务器是否可以ping通GCP虚拟机的外部IP,排除网络不通的问题
- 查看MySQL的错误日志,通常路径为/var/log/mysql/error.log,里面会有详细的连接失败原因
安全注意事项
生产环境中不建议直接将MySQL端口开放到公网,更安全的做法是:
- 使用GCP的内部网络或者VPN实现内网连接,避免端口暴露在公网
- 严格限制允许访问MySQL的IP范围,不要使用0.0.0.0/0允许所有IP
- 使用强密码,并且定期更换数据库用户密码
- 只授予应用所需的最小数据库权限,不要使用ALL PRIVILEGES