
本文详细解析 WordPress 在 Apache 虚拟主机环境下无法连接 MariaDB 的常见原因,重点指出 localhost 与 127.0.0.1 在 MySQL/MariaDB 协议栈中的本质差异,并提供可立即验证的端口显式指定、用户权限修正及配置一致性检查方案。
本文详细解析 wordpress 在 apache 虚拟主机环境下无法连接 mariadb 的常见原因,重点指出 `localhost` 与 `127.0.0.1` 在 mysql/mariadb 协议栈中的本质差异,并提供可立即验证的端口显式指定、用户权限修正及配置一致性检查方案。
在 WordPress + Apache + MariaDB 的典型 LAMP 环境中,“Error establishing database connection” 是高频故障,但其根源往往并非网络不通或服务宕机,而是MySQL 连接协议层面的隐式行为差异。关键在于:当 PHP 使用 mysqli 或 PDO 连接 localhost 时,默认启用 Unix socket 套接字通信(而非 TCP/IP);而若 MariaDB 配置了 bind-address = 127.0.0.1 或禁用了 socket,或用户权限仅针对 127.0.0.1(非 localhost),就会导致连接静默失败——这正是你能在终端用 mysql -u cr_user -p 成功登录(客户端自动回退到 socket),却在 PHP 中始终报错的根本原因。
✅ 正确解决方案:强制走 TCP 并统一地址协议
最直接、低侵入性的修复方式是显式指定端口 3306,强制 PHP 使用 TCP/IP 协议连接,绕过 socket 行为歧义:
// 测试文件 test-db.php 中修改连接字符串:
<?php
$servername = "localhost:3306"; // ← 关键:添加 :3306
$username = "cr_user";
$password = "password";
$db = "tr_wordpress";
$conn = new mysqli($servername, $username, $password, $db);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully via TCP on port 3306";
?>同时,同步更新 WordPress 配置文件 wp-config.php:
define('DB_NAME', 'tr_wordpress');
define('DB_USER', 'cr_user');
define('DB_PASSWORD', 'password');
define('DB_HOST', 'localhost:3306'); // ← 同样添加 :3306
define('DB_CHARSET', 'utf8mb4'); // 建议升级为 utf8mb4
define('DB_COLLATE', '');? 为什么有效?
localhost:3306 明确告诉 MySQLi 使用 TCP 连接本地 3306 端口,不再尝试 Unix socket。只要 MariaDB 的 bind-address 允许 127.0.0.1(默认即如此),且防火墙放行本地端口,该方式 100% 可靠。
WordPress API Pro下载生产级WordPress REST API集成,用于管理文章、页面、媒体、WooCommerce产品、Elementor内容、SEO元数据、ACF及JetEngine字段
⚠️ 必须同步检查的三项配置
-
MariaDB 用户权限必须匹配连接方式
若你已将用户主机改为 '127.0.0.1',则 PHP 中 DB_HOST 也必须设为 '127.0.0.1:3306'(不能混用 localhost)。推荐统一使用 127.0.0.1:3306 并重置权限:-- 删除旧权限(含 localhost 和 127.0.0.1) DROP USER IF EXISTS 'cr_user'@'localhost'; DROP USER IF EXISTS 'cr_user'@'127.0.0.1'; -- 创建新用户并授权(明确指定 127.0.0.1) CREATE USER 'cr_user'@'127.0.0.1' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON `tr_wordpress`.* TO 'cr_user'@'127.0.0.1'; FLUSH PRIVILEGES;
-
确认 MariaDB 监听配置
检查 /etc/mysql/mariadb.conf.d/50-server.cnf(路径依发行版可能不同)中:bind-address = 127.0.0.1 # ✅ 允许本地 TCP 连接 # skip-networking = 0 # ❌ 确保未启用(否则禁用 TCP)
修改后重启服务:sudo systemctl restart mariadb
-
验证端口连通性(不依赖 PHP)
# 从 Web 服务器本机测试 TCP 连接 telnet 127.0.0.1 3306 # 或使用 mysql 客户端强制 TCP mysql -h 127.0.0.1 -u cr_user -p'password' tr_wordpress
? 总结:避免踩坑的黄金原则
- 永远不要在生产环境混用 localhost(socket)和 127.0.0.1(TCP) —— 统一选择 127.0.0.1:3306 最稳定;
- WordPress 的 DB_HOST 不支持 socket 路径写法(如 /var/run/mysqld/mysqld.sock),如需 socket 必须改用 localhost 且确保 MariaDB 启用 socket;
- 权限表中的 Host 字段区分严格:'localhost' ≠ '127.0.0.1',二者在权限系统中是完全独立的条目;
- 当 mysql -u ... 命令成功但 PHP 失败时,90% 是协议不一致问题,优先尝试 :3306 后缀。
完成上述步骤后,刷新 WordPress 页面,数据库连接将恢复正常。此方案无需修改 Apache 或 PHP 配置,兼容所有主流 Linux 发行版与 MariaDB 版本(10.3+)。


















