适用场景
这篇教程适用于下面这类问题:
- 设备运行在 QNAP / QTS 环境。
- phpMyAdmin 升级后,原本能登录的空密码数据库账号突然无法登录。
- 页面能打开,但登录时提示空密码不允许、认证失败,或者输入空密码后始终进不去。
- 你需要通过SSH到设备上检查实际生效的 phpMyAdmin 配置。
一句话结论
如果你的 phpMyAdmin 是升级后才突然不能登录空密码账号,最常见的根因就是:
$cfg['Servers'][$i]['AllowNoPassword'] = false;
升级后的新版本配置文件把 AllowNoPassword 恢复到了默认值 false,于是空密码账号会被 phpMyAdmin 在前端直接拦下。
典型现象
常见表现包括:
- 升级前正常,升级后异常。
- phpMyAdmin 页面能正常打开,但空密码账号无法登录。
- 没有明显的 PHP 报错,登录页本身也能正常加载。
- 数据库服务本身未必挂掉,问题可能只是在 phpMyAdmin 配置层。
优先判断:到底是 phpMyAdmin 问题,还是数据库账号问题?
先做这个区分,不然容易一开始就钻错方向。
更像 phpMyAdmin 配置问题的特征
- 升级前空密码能用,升级后立刻失效。
- 页面能正常访问。
config.inc.php中存在AllowNoPassword = false。
更像数据库账号问题的特征
- 升级 phpMyAdmin 前,这个账号其实已经不稳定。
- 不只是 phpMyAdmin,连命令行登录也失败。
- 数据库账号插件、密码、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"
重点看这些文件:
config.inc.phpconfig.sample.inc.phpcomposer.jsonRELEASE-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;
那基本就已经找到问题了。
如果配置里有多个服务器条目,例如:
- 一个对应旧版 MariaDB
- 一个对应新版 MariaDB
那就要把每个实际要用到的条目都检查一遍,不要只改其中一个。
第四步:先备份,再修改配置
修改前一定先备份:
cfg=/实际路径/config.inc.php
cp "$cfg" "$cfg.bak.$(date +%Y%m%d-%H%M%S)"
然后把 AllowNoPassword 从 false 改成 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 页面是否已恢复
如果设备本机装了 curl 或 wget,可以从本机直接测页面是否还能正常打开:
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 登录页,说明:
- phpMyAdmin 站点本身还活着。
- 配置改动没有把程序改坏。
你也可以顺便看一下配置错误检查页:
curl -ksS http://127.0.0.1/phpMyAdmin/show_config_errors.php
如果这里没有明显报错,通常说明配置语法是好的。
第六步:如果还不能登录,再查数据库账号本身
如果 AllowNoPassword 已经改回 true,但空密码账号还是不能登录,那么问题多半已经下沉到数据库层。
这时要重点检查:
- 你登录的是哪一个数据库实例。
- 这个账号是不是仍然为空密码。
- 认证插件是否变化。
- 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 远程排障,建议流程如下:
- 先确认 SSH 能稳定连通。
- 再确认 Web 真实路径。
- 再读
config.inc.php。 - 只做最小修改,不要同时改数据库和 Web 配置。
- 改完立刻验证页面和登录行为。
这样能避免一次改太多,最后不知道究竟是哪一步生效。
最小修复模板
如果你已经确认是这个问题,最小修复动作通常只有下面几步:
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:看到页面正常,就说明配置没问题
也不对。登录限制类配置问题往往不会让首页直接报错。
推荐的最终做法
如果你确实需要保留空密码登录能力,建议:
- 明确知道自己是出于兼容或历史原因这么做。
- 至少把配置改动记录下来,避免下一次升级后再次踩坑。
- 长期看,尽量把数据库账号改成有密码,并限制可访问来源。
如果你只是为了快速恢复旧环境,这次把 AllowNoPassword 改回 true 通常就足够。
排障总结
这类问题的最高概率根因是:
- phpMyAdmin 升级。
config.inc.php被新版本覆盖或重置。AllowNoPassword回到默认false。- 空密码账号被 phpMyAdmin 拒绝。
因此最短路径永远是:
- 找真实安装目录。
- 查
config.inc.php。 - 把
AllowNoPassword改回true。 - 重新验证。
如果你把这四步先做了,大多数同类问题都能很快解决。