直接用 apt 安装 Nginx 并正确配置 location 块是最稳妥路径,因软链接会暴露 setup 目录、绕过权限控制,且 root 易致 404;必须用 alias 映射 /phpmyadmin 到 /usr/share/phpmyadmin/,并显式设置 fastcgi_param SCRIPT_FILENAME,同时补全 $cfg['blowfish_secret'] 和 $cfg['TempDir'] 并确保 www-data 可读写临时目录。

直接用 apt 安装并配 Nginx location 块是最稳的路径,跳过 Apache 选项、补全 $cfg['blowfish_secret'] 和 $cfg['TempDir']、确保 www-data 可读写临时目录——这四步做完,/phpmyadmin 就能正常访问,其他方式大概率白屏或 502。
为什么不能直接软链接到 /var/www/html/phpmyadmin
Ubuntu 的 phpmyadmin 包默认不放配置文件进 web 根目录,只部署在 /usr/share/phpmyadmin/。软链接过去看似省事,但会暴露 setup/ 目录(若未删)、绕过 APT 自带的权限控制,且 config.inc.php 中的 $cfg['TempDir'] 默认指向 /var/lib/phpmyadmin/tmp,而该路径常因权限不足导致登录失败或“无法加载页面”。更关键的是:Nginx 不识别 Apache 的 .htaccess 规则,软链接后若没重写 PHP 处理逻辑,.php 文件会被当静态文件返回源码。
location /phpmyadmin 必须用 alias 而非 root
用 root 会导致 Nginx 拼出错误的物理路径,比如 root /usr/share/phpmyadmin; + 请求 /phpmyadmin/index.php → 实际查找 /usr/share/phpmyadmin/phpmyadmin/index.php(多了一层目录),结果 404。正确做法是:
-
alias明确映射 URL 路径到物理路径,alias /usr/share/phpmyadmin/;表示所有/phpmyadmin/xxx都对应/usr/share/phpmyadmin/xxx - PHP 脚本必须单独匹配,否则
index.php无法被 FastCGI 处理;正则要覆盖完整路径,如^/phpmyadmin/(.+\.php)$,再用alias把$1补回完整路径 -
fastcgi_param SCRIPT_FILENAME $request_filename;在alias下不可靠,应显式写成fastcgi_param SCRIPT_FILENAME /usr/share/phpmyadmin/$1;或用$document_root$fastcgi_script_name(需配合root,不推荐)
$cfg['blowfish_secret'] 和 $cfg['TempDir'] 缺一不可
这两个配置项漏掉任何一个,phpMyAdmin 都会拒绝启动:
立即学习“PHP免费学习笔记(深入)”;
-
$cfg['blowfish_secret']为空 → 登录页直接报错 “配置文件现在需要绝密的短语密码”,或跳转到空白index.php -
$cfg['TempDir']未设或目录不可写 → 登录后首页白屏、SQL 查询失败、导出中断,日志里常见session_start(): Failed to initialize storage module - 推荐设置:
$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';,然后执行:sudo mkdir -p /var/lib/phpmyadmin/tmp && sudo chown www-data:www-data /var/lib/phpmyadmin/tmp && sudo chmod 750 /var/lib/phpmyadmin/tmp
常见 502/404/空白页的快速定位点
不是改完配置就万事大吉,这几个地方一查一个准:
- 检查
fastcgi_pass的 socket 路径是否匹配当前 PHP-FPM 版本:ls /run/php/看实际文件名,比如php8.3-fpm.sock,而不是沿用旧教程里的php7.4-fpm.sock - 确认
www-data用户对/usr/share/phpmyadmin/有读权限,对$cfg['TempDir']有读写权限(ls -ld /usr/share/phpmyadmin /var/lib/phpmyadmin/tmp) - 用
curl -I http://localhost/phpmyadmin/index.php看响应头,若返回text/plain,说明 PHP 没生效,是 location 块没匹配上或fastcgi_params漏了include - 查看 Nginx error log:
sudo tail -f /var/log/nginx/error.log,502 通常意味着 PHP-FPM 没起来或 socket 权限不对;404 多半是alias路径拼错;空白页大概率是TempDir写入失败
子目录访问真正麻烦的从来不是 location 写法,而是权限链和配置项的隐式依赖——www-data 要能读代码、能写 session、能生成临时文件,三者缺一,页面就断在某个看不见的环节。



















