在阿里云 ECS 实例中部署 WordPress 时,数据库连接失败(通常表现为“建立数据库连接错误”)是一个非常常见的问题。这通常涉及 WordPress 配置、数据库服务状态、网络与安全组、以及权限设置 等多个层面。
以下是导致连接失败的常见原因及排查步骤,按优先级排序:
1. wp-config.php 配置错误(最常见)
WordPress 通过 wp-config.php 文件读取数据库连接信息。如果其中任何一项填写错误,都会导致连接失败。
- 数据库名称(DB_NAME)错误:确认你创建的数据库名称是否与代码中一致。
- 用户名(DB_USER)错误:确认使用的数据库用户是否正确。
- 密码(DB_PASSWORD)错误:这是最容易出错的地方。注意:
- 密码是否包含特殊字符?如果有,可能需要转义或确保引号使用正确。
- 是否复制了多余的空格?
- 主机地址(DB_HOST)错误:
- 如果是本地数据库(MySQL/MariaDB 安装在同一台 ECS 上),通常填
localhost或127.0.0.1。 - 如果是远程数据库(如 RDS MySQL),必须填写 RDS 提供的内网 endpoint(如果 WordPress 和 RDS 在同一地域)或公网 endpoint(需开启公网访问)。
- 注意:不要随意修改默认端口(3306),除非你自定义了端口并相应更新了配置。
- 如果是本地数据库(MySQL/MariaDB 安装在同一台 ECS 上),通常填
✅ 检查方法:
打开 wp-config.php,逐字核对以下四项:
define('DB_NAME', 'your_database_name');
define('DB_USER', 'your_username');
define('DB_PASSWORD', 'your_password');
define('DB_HOST', 'localhost'); // 或 RDS 地址
2. 数据库服务未运行或未启动
即使配置正确,如果数据库服务本身没有运行,也无法连接。
- MySQL/MariaDB 服务停止:检查服务状态。
systemctl status mysql # CentOS/RHEL systemctl status mariadb # CentOS/RHEL service mysql status # Ubuntu/Debian - 服务崩溃或占用端口异常:查看日志
/var/log/mysqld.log或/var/log/mysql/error.log是否有报错。
✅ 解决:
systemctl start mysql
systemctl enable mysql # 设置开机自启
3. 数据库用户权限不足或不存在
WordPress 使用的数据库用户可能没有被授予对指定数据库的访问权限。
- 用户不存在:确认该用户在数据库中确实存在。
- 权限缺失:用户可能只拥有部分权限,或者根本没有连接到该数据库的权限。
- Host 限制:MySQL 用户是绑定 host 的(如
'user'@'localhost'vs'user'@'%')。如果 WordPress 从外部连接,可能需要%权限;如果是本地连接,必须是'user'@'localhost'。
✅ 检查与修复:
登录 MySQL,执行:
-- 检查用户是否存在及权限
SHOW GRANTS FOR 'your_username'@'localhost';
-- 如果权限不足,重新授权(替换为你的实际值)
GRANT ALL PRIVILEGES ON your_database_name.* TO 'your_username'@'localhost' IDENTIFIED BY 'your_password';
FLUSH PRIVILEGES;
4. 安全组 / 防火墙阻止连接(适用于远程数据库)
如果你使用的是 RDS MySQL 或其他远程数据库,而不是本地安装的 MySQL,那么网络连通性是关键。
- 阿里云安全组规则:
- ECS 实例的安全组是否放行了出站流量到 RDS 的端口(默认 3306)?
- RDS 实例的安全组是否允许来自你的 ECS 内网 IP 的入站连接?
- 系统防火墙(iptables/firewalld):
- 检查 ECS 内部是否运行
firewalld或iptables,并阻止了 3306 端口。firewall-cmd --list-all # 查看 firewalld 规则 iptables -L # 查看 iptables 规则
- 检查 ECS 内部是否运行
✅ 解决:
- 在阿里云控制台 → 安全组中添加规则:允许 TCP 3306 端口(来源为 RDS 的内网 IP 段或特定 ECS 私有 IP)。
- 或在 ECS 内部关闭防火墙测试:
systemctl stop firewalld(仅用于测试,生产环境建议精确放行)。
5. MySQL 监听地址限制
MySQL 默认可能只监听 127.0.0.1,不允许外部连接。
- 检查
/etc/my.cnf或/etc/mysql/my.cnf中的bind-address配置。- 如果设置为
127.0.0.1,则只能本地连接。 - 如果需要远程连接,应设置为
0.0.0.0或注释掉该行。
- 如果设置为
- 重启 MySQL 服务使配置生效。
⚠️ 安全警告:将 MySQL 暴露给公网极其危险!仅在内网互通或使用 SSH 隧道时推荐这样做。
6. 数据库字符集或版本兼容性问题
虽然较少见,但某些旧版 WordPress 与新版 MySQL(如 MySQL 8.0+)可能存在兼容性问题。
- MySQL 8.0 认证插件:MySQL 8.0 默认使用
caching_sha2_password,而老版本 PHP 或 WordPress 可能不支持。- 解决方案:创建用户时使用
mysql_native_password插件。CREATE USER 'wp_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
- 解决方案:创建用户时使用
7. DNS 解析问题(针对 RDS)
如果使用域名连接 RDS,确保 ECS 能正确解析该域名。
- 测试命令:
ping rds-endpoint.mysql.rds.aliyuncs.com nslookup rds-endpoint.mysql.rds.aliyuncs.com - 如果无法解析,检查
/etc/resolv.conf或 DNS 服务器配置。
✅ 快速排查清单
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 检查 wp-config.php |
数据库名、用户名、密码、主机完全正确 |
| 2 | 检查 MySQL 服务状态 | systemctl status mysql 显示 active (running) |
| 3 | 本地测试连接 | 在 ECS 上执行 mysql -u username -p -h localhost 能否成功登录 |
| 4 | 检查用户权限 | SHOW GRANTS FOR 'user'@'host'; 包含对数据库的 ALL PRIVILEGES |
| 5 | 检查安全组/防火墙 | 确保 3306 端口在安全组和系统防火墙中已放行 |
| 6 | 检查 MySQL 监听地址 | bind-address 不是 127.0.0.1(如需远程连接) |
💡 建议
- 优先使用内网连接:如果 WordPress 和数据库在同一地域,务必使用 RDS 的内网地址,速度更快且免费。
- 备份数据:在修改任何配置前,务必备份
wp-config.php和数据库。 - 查看错误日志:
- WordPress 错误日志:开启
WP_DEBUG在wp-config.php中,可查看更详细的数据库错误信息。define('WP_DEBUG', true); define('WP_DEBUG_LOG', true);
- WordPress 错误日志:开启
通过以上步骤,90% 以上的数据库连接问题都可以被定位和解决。
ECLOUD博客