QNAP 上 phpMyAdmin 升级后空密码账号无法登录:排障与修复教程

14 阅读6分钟

适用场景

这篇教程适用于下面这类问题:

  1. 设备运行在 QNAP / QTS 环境。
  2. phpMyAdmin 升级后,原本能登录的空密码数据库账号突然无法登录。
  3. 页面能打开,但登录时提示空密码不允许、认证失败,或者输入空密码后始终进不去。
  4. 你需要通过SSH到设备上检查实际生效的 phpMyAdmin 配置。

一句话结论

如果你的 phpMyAdmin 是升级后才突然不能登录空密码账号,最常见的根因就是:

$cfg['Servers'][$i]['AllowNoPassword'] = false;

升级后的新版本配置文件把 AllowNoPassword 恢复到了默认值 false,于是空密码账号会被 phpMyAdmin 在前端直接拦下。

典型现象

常见表现包括:

  1. 升级前正常,升级后异常。
  2. phpMyAdmin 页面能正常打开,但空密码账号无法登录。
  3. 没有明显的 PHP 报错,登录页本身也能正常加载。
  4. 数据库服务本身未必挂掉,问题可能只是在 phpMyAdmin 配置层。

优先判断:到底是 phpMyAdmin 问题,还是数据库账号问题?

先做这个区分,不然容易一开始就钻错方向。

更像 phpMyAdmin 配置问题的特征

  1. 升级前空密码能用,升级后立刻失效。
  2. 页面能正常访问。
  3. config.inc.php 中存在 AllowNoPassword = false

更像数据库账号问题的特征

  1. 升级 phpMyAdmin 前,这个账号其实已经不稳定。
  2. 不只是 phpMyAdmin,连命令行登录也失败。
  3. 数据库账号插件、密码、host 限制发生了变化。

经验上,先查 phpMyAdmin 配置,成本最低,命中率也最高。

第一步:找到 phpMyAdmin 实际安装目录

在 QNAP 上,Web 入口路径和真实安装路径经常不是同一个位置,必须先确认软链接最终指向哪里。

常见入口之一:

readlink -f /share/Web/phpMyAdmin

如果返回的是某个 QPKG 路径,例如类似下面的结构:

/share/某个卷/.qpkg/phpMyAdmin/phpMyAdmin

说明实际生效的是 QPKG 目录下那套 phpMyAdmin,而不是你以为的其他副本。

然后列一下目录内容确认版本文件和配置文件都在:

real=$(readlink -f /share/Web/phpMyAdmin)
ls -la "$real"

重点看这些文件:

  1. config.inc.php
  2. config.sample.inc.php
  3. composer.json
  4. RELEASE-DATE-*VERSION

第二步:确认版本

可以直接看 composer.json 或发行文件:

sed -n '1,200p' /实际路径/composer.json

如果里面能看到类似:

"version": "5.2.3"

说明你当前运行的是升级后的新版本,而不是旧包残留。

第三步:直接检查 config.inc.php

这是最关键的一步。

查看配置文件:

awk '{printf "%4d  %s\n", NR, $0}' /实际路径/config.inc.php | sed -n '1,120p'

重点找下面这些配置:

$cfg['blowfish_secret'] = '...';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;

如果你看到:

$cfg['Servers'][$i]['AllowNoPassword'] = false;

那基本就已经找到问题了。

如果配置里有多个服务器条目,例如:

  1. 一个对应旧版 MariaDB
  2. 一个对应新版 MariaDB

那就要把每个实际要用到的条目都检查一遍,不要只改其中一个。

第四步:先备份,再修改配置

修改前一定先备份:

cfg=/实际路径/config.inc.php
cp "$cfg" "$cfg.bak.$(date +%Y%m%d-%H%M%S)"

然后把 AllowNoPasswordfalse 改成 true

sed -i "s/\['AllowNoPassword'\] = false;/\['AllowNoPassword'\] = true;/g" "$cfg"

改完再次确认:

awk '{printf "%4d  %s\n", NR, $0}' "$cfg" | sed -n '20,100p'

你应该能看到类似:

$cfg['Servers'][$i]['AllowNoPassword'] = true;

第五步:检查 phpMyAdmin 页面是否已恢复

如果设备本机装了 curlwget,可以从本机直接测页面是否还能正常打开:

curl -ksS http://127.0.0.1/phpMyAdmin/index.php | sed -n '1,80p'

或者:

wget -qO- http://127.0.0.1/phpMyAdmin/index.php | sed -n '1,80p'

如果能返回正常 HTML 登录页,说明:

  1. phpMyAdmin 站点本身还活着。
  2. 配置改动没有把程序改坏。

你也可以顺便看一下配置错误检查页:

curl -ksS http://127.0.0.1/phpMyAdmin/show_config_errors.php

如果这里没有明显报错,通常说明配置语法是好的。

第六步:如果还不能登录,再查数据库账号本身

如果 AllowNoPassword 已经改回 true,但空密码账号还是不能登录,那么问题多半已经下沉到数据库层。

这时要重点检查:

  1. 你登录的是哪一个数据库实例。
  2. 这个账号是不是仍然为空密码。
  3. 认证插件是否变化。
  4. host 限制是否变化。

例如你的 phpMyAdmin 可能同时配置了两个 socket:

$cfg['Servers'][$i]['socket'] = '/tmp/mysql.sock';
$cfg['Servers'][$i]['socket'] = '/var/run/mariadb10.sock';

那就要明确你选的是哪一个服务器条目。

如果系统中能找到 MySQL/MariaDB 客户端,可以进一步核对账号状态,例如:

/usr/local/mariadb/bin/mysql --protocol=SOCKET --socket=/var/run/mariadb10.sock -u某用户 -p

或者查看 mysql.user 表中的账号信息。

QNAP 环境下的几个注意点

1. Web 路径经常是软链接

不要只看 /share/Web/phpMyAdmin 这个表面路径,要用 readlink -f 找真实路径。

2. 可能有多套 MariaDB

QNAP 上经常同时存在旧版和新版数据库实例,phpMyAdmin 配置里会出现多个 server 条目。只修一半,问题可能还在。

3. 不要直接假设“数据库坏了”

很多时候数据库没坏,只是 phpMyAdmin 升级后把 AllowNoPassword 还原成默认值了。

4. 修改前一定备份

QPKG 更新或系统更新后,配置很可能被再次覆盖。留备份能让你快速回滚和对比。

如果你是通过 SSH 远程排障

如果你不是在 QNAP 控制台本地操作,而是通过 SSH 远程排障,建议流程如下:

  1. 先确认 SSH 能稳定连通。
  2. 再确认 Web 真实路径。
  3. 再读 config.inc.php
  4. 只做最小修改,不要同时改数据库和 Web 配置。
  5. 改完立刻验证页面和登录行为。

这样能避免一次改太多,最后不知道究竟是哪一步生效。

最小修复模板

如果你已经确认是这个问题,最小修复动作通常只有下面几步:

real=$(readlink -f /share/Web/phpMyAdmin)
cfg="$real/config.inc.php"
cp "$cfg" "$cfg.bak.$(date +%Y%m%d-%H%M%S)"
sed -i "s/\['AllowNoPassword'\] = false;/\['AllowNoPassword'\] = true;/g" "$cfg"
grep -n "AllowNoPassword" "$cfg"

常见误区

误区 1:升级后不能登录,一定是数据库密码变了

不一定。很多时候只是 phpMyAdmin 前端不再允许空密码。

误区 2:改一个 server 条目就够了

不一定。QNAP 上经常有多个 socket、多套数据库实例。

误区 3:只要 authorized_keys 或 SSH 打通,数据库问题也会顺带解决

不会。SSH 只是排障手段,不是根因。

误区 4:看到页面正常,就说明配置没问题

也不对。登录限制类配置问题往往不会让首页直接报错。

推荐的最终做法

如果你确实需要保留空密码登录能力,建议:

  1. 明确知道自己是出于兼容或历史原因这么做。
  2. 至少把配置改动记录下来,避免下一次升级后再次踩坑。
  3. 长期看,尽量把数据库账号改成有密码,并限制可访问来源。

如果你只是为了快速恢复旧环境,这次把 AllowNoPassword 改回 true 通常就足够。

排障总结

这类问题的最高概率根因是:

  1. phpMyAdmin 升级。
  2. config.inc.php 被新版本覆盖或重置。
  3. AllowNoPassword 回到默认 false
  4. 空密码账号被 phpMyAdmin 拒绝。

因此最短路径永远是:

  1. 找真实安装目录。
  2. config.inc.php
  3. AllowNoPassword 改回 true
  4. 重新验证。

如果你把这四步先做了,大多数同类问题都能很快解决。