发布时间:2026-09-24 12:31 更新时间:2026-09-24 12:31 阅读量:0
不少站长都遇到过这种别扭的情况:宝塔面板里 MySQL 明明显示“运行中”,数据库也能用 phpMyAdmin 打开,可 WordPress 前台就是一行“Error establishing a database connection”。重启 MySQL、重启 PHP、重启 Nginx 都试过,问题照旧。这类故障的根源往往不在数据库本身,而在于 WordPress 用一个地址去连数据库,而 MySQL 只在另一个地址上监听。本文沿着 wp-config.php 里的 DB_HOST 往下查,把主机名、3306 端口和 socket 路径三者的关系讲清楚。
这是最容易踩的坑。在 MySQL 客户端和 PHP 的 mysqli 扩展里,localhost 是一个特殊值,它不走 TCP,而是走 Unix socket 文件;只有写成 127.0.0.1,才会真正发起 TCP 连接去连 3306 端口。所以会出现这种组合:数据库确实在跑,socket 文件也在,但 MySQL 的 bind-address 只绑了 127.0.0.1,TCP 能通;反过来如果 socket 路径变了或者 PHP 找不到 socket,localhost 写法就会失败,而 127.0.0.1 反而正常。
排查的第一步,就是打开网站根目录下的 wp-config.php,看 DB_HOST 到底写的是什么:
grep -n "DB_HOST\|DB_NAME\|DB_USER" /www/wwwroot/你的站点目录/wp-config.php
宝塔面板创建站点时,默认写入的通常是 localhost。如果你后来手动改过 MySQL 配置、迁移过数据目录,或者从别的主机导入过网站,这里的值就可能和当前环境对不上。
确认 DB_HOST 之后,依次核对下面三个地方。注意所有命令里的路径和配置项会因 MySQL 版本与安装方式不同而有差异,具体以你自己服务器的 my.cnf 和官方文档为准。
第一处,socket 文件是否存在。先看 PHP 实际用的是哪个 socket:
php -i | grep -i "pdo_mysql.default_socket\|mysqli.default_socket"
ls -l /tmp/mysql.sock /var/lib/mysql/mysql.sock /www/server/mysql/mysql.sock 2>/dev/null
PHP 报的 socket 路径,必须和 MySQL 配置里 socket= 指向的文件是同一个。两边对不上时,localhost 写法必然连接失败。宝塔环境下 socket 一般位于 /tmp/mysql.sock,但也可能被改到数据目录下,以实际 ls 结果为准。
第二处,3306 端口是否在监听、绑在哪个地址上。用 ss 或 netstat 看一眼:
ss -lntp | grep 3306
mysql -uroot -p -e "SHOW VARIABLES LIKE 'bind_address'; SHOW VARIABLES LIKE 'port';"
如果 bind_address 是 127.0.0.1,说明只允许本机 TCP 连接,WordPress 和 MySQL 在同一台机器上没问题;如果这里被写成了某个内网 IP,或者干脆没监听 3306,那么 DB_HOST 写 127.0.0.1 也会连不上。有些环境为了安全会把 MySQL 只留 socket、不监听 TCP,这时 wp-config 里就必须用 localhost。
第三处,如果 WordPress 和数据库不在同一台机器(比如数据库单独一台服务器),那 DB_HOST 要写数据库服务器的内网 IP,同时数据库用户要有对应的远程访问授权,防火墙和安全组也要放行 3306。不建议把 3306 直接暴露到公网,需要远程连接时优先走内网或 SSH 隧道。
判断到底该用哪种写法,最直接的办法是用 PHP 分别测一次。在站点目录建一个临时文件,测完立刻删掉:
cat > /www/wwwroot/你的站点目录/dbtest.php <<'EOF'
<?php
$cfg = ['localhost', '127.0.0.1'];
foreach ($cfg as $host) {
$c = @mysqli_connect($host, '数据库用户名', '数据库密码', '数据库名');
echo $host . ' => ' . ($c ? 'OK' : mysqli_connect_error()) . "\n";
}
EOF
php /www/wwwroot/你的站点目录/dbtest.php
rm -f /www/wwwroot/你的站点目录/dbtest.php
哪个主机名返回 OK,就把 wp-config.php 里的 DB_HOST 改成哪个;两个都失败,说明账号密码、库名或授权出了问题,与主机名无关。改完 wp-config 通常不需要重启服务,但如果你开了 OPcache 且配置缓存较激进,可以重载一次 PHP-FPM:
/etc/init.d/php-fpm-74 reload # 版本号以实际安装为准
最后提醒两个容易误判的点。一是宝塔面板显示 MySQL“运行中”,只代表进程活着,不代表监听地址、socket 路径和你写入 wp-config 的值一致,面板状态不能替代连接测试。二是有些主机商会把 localhost 解析成 IPv6 的 ::1,而 MySQL 只监听了 IPv4,这种情况下把 DB_HOST 换成 127.0.0.1 往往就能恢复,但前提是 MySQL 确实开了 TCP 监听。
按这个顺序走一遍:先看 wp-config 的 DB_HOST,再核对 socket 文件、3306 监听与 bind-address,最后用一段最小 PHP 脚本实测哪种写法能通。多数“面板正常但 WordPress 连不上”的问题,都能在这一步定位到具体是主机名写法不匹配,而不是数据库真的坏了。定下来之后,把正确的 DB_HOST 记进自己的部署笔记,下次迁移或换服务器时能省下不少排查时间。
| 📑 | 📅 |
|---|---|
| WordPress改文章前台不变:三层缓存清理顺序与验证 | 2026-09-24 |
| 宝塔面板磁盘挂载与网站目录迁移:/www 换盘后的路径、权限与面板数据同步 | 2026-09-24 |
| 网站被CDN缓存住旧页面:缓存键、边缘刷新与源站头冲突排查 | 2026-09-24 |
| Nginx 一张证书配多个域名:SAN 填写与漏配排查 | 2026-09-24 |
| 网站切HTTPS后百度统计没数据:referrer、混合内容与代码位置排查 | 2026-09-23 |
| 宝塔面板Nginx伪静态改了不生效:规则文件位置与重载验证 | 2026-09-24 |
| WordPress 开启 HTTPS 后台重定向循环:is_ssl 与反代头排查 | 2026-09-24 |
| 域名下手机跳m站收录分散:自适应与跳转取舍 | 2026-09-24 |
| 宝塔面板定时任务备份到对象存储:命令行工具安装、密钥权限与保留份数设置 | 2026-09-24 |
| PHP-FPM 进程数怎么调:pm.max_children 与内存换算、502 反复排查 | 2026-09-25 |