phpMyAdmin 是最流行的 MySQL/MariaDB Web 管理工具。本文涵蓋:下載驗證、配置文件詳解、認證模式選擇、blowfish_secret 設置、Nginx/Apache 虛擬主機配置、HTTPS 強制、常見報錯(mysqli 擴展缺失、權限、登錄失敗)修復。
# 官網:https://www.phpmyadmin.net/downloads/
# 建議下載 "english" 版(含所有語言)或 "all-languages"
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz
# 驗證簽名(可選但推薦)
gpg --verify phpMyAdmin-5.2.1-all-languages.tar.gz.asc
# 解壓到 Web 可訪問目錄
tar -xzf phpMyAdmin-5.2.1-all-languages.tar.gz -C /var/www/html/
mv /var/www/html/phpMyAdmin-5.2.1-all-languages /var/www/html/phpmyadmin
chown -R www-data:www-data /var/www/html/phpmyadmin
復制 config.sample.inc.php 為 config.inc.php,修改以下關鍵項:
<?php
// 基礎連接
$cfg['Servers'][$i]['host'] = 'localhost'; // 或 127.0.0.1、Socket 路徑
$cfg['Servers'][$i]['port'] = ''; // 空=默認 3306
$cfg['Servers'][$i]['socket'] = ''; // 如 /var/run/mysqld/mysqld.sock
$cfg['Servers'][$i]['user'] = 'root'; // 管理用戶
$cfg['Servers'][$i]['password'] = ''; // 密碼(留空提示輸入)
$cfg['Servers'][$i]['auth_type'] = 'cookie'; // 認證模式:cookie/http/config/signon
$cfg['Servers'][$i]['compress'] = false; // 壓縮傳輸
// 必須設置:Cookie 認證加密密鑰(32 字符隨機字串)
$cfg['blowfish_secret'] = 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6'; // openssl_random_pseudo_bytes(32) 生成
// 介面語言
$cfg['DefaultLang'] = 'zh_CN'; // 簡體中文
$cfg['DefaultConnectionCollation'] = 'utf8mb4_general_ci';
// 安全建議
$cfg['ForceSSL'] = true; // 強制 HTTPS(需服務器配置 SSL)
$cfg['LoginCookieValidity'] = 1440; // Cookie 有效期 24 分鐘
$cfg['LoginCookieStore'] = 0; // 瀏覽器關閉即失效
$cfg['MaxRows'] = 50; // 預設顯示行數
$cfg['ShowAll'] = false; // 不顯示「顯示全部」
// 隱藏資訊結構數據庫
$cfg['Servers'][$i]['hide_db'] = '^(information_schema|performance_schema|mysql|sys)$';
// 允許無密碼登錄(極不推薦生產)
// $cfg['Servers'][$i]['AllowNoPassword'] = false;
?>
| 模式 | 原理 | 優點 | 缺點 | 適用 |
|---|---|---|---|---|
| cookie | PHP Session + Cookie 存儲加密憑證 | 支援多用戶、登出、HTTPS 安全 | 需 blowfish_secret、Session 存儲正常 | **生產首選** |
| http | HTTP Basic Auth | 無需 PHP Session、簡單 | 無法登出、瀏覽器彈窗體驗差、憑證明文傳輸(需 HTTPS) | 內網、臨時 |
| config | 配置文件寫死用戶/密 | 免登錄、極簡 | 極不安全、任何人訪問即有權限 | 僅本地開發、受信網絡 |
| signon | 單點登錄 (SSO) 整合 | 統一身份認證 | 需實現 signon_url 接口 | 企業級整合 |
server {
listen 443 ssl http2;
server_name pma.example.com;
root /var/www/html/phpmyadmin;
index index.php;
ssl_certificate /etc/ssl/certs/pma.example.com.crt;
ssl_certificate_key /etc/ssl/private/pma.example.com.key;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
}
# 隱藏敏感目錄
location ~ ^/(libraries|setup|templates|sql|js/vendor) {
deny all;
}
}
<VirtualHost *:443>
ServerName pma.example.com
DocumentRoot /var/www/html/phpmyadmin
SSLEngine on
SSLCertificateFile /etc/ssl/certs/pma.example.com.crt
SSLCertificateKeyFile /etc/ssl/private/pma.example.com.key
<Directory /var/www/html/phpmyadmin>
Options FollowSymLinks
DirectoryIndex index.php
Require all granted
</Directory>
# 拒絕敏感目錄
<Directory /var/www/html/phpmyadmin/libraries>
Require all denied
</Directory>
</VirtualHost>
| 錯誤訊息 | 原因 | 修復 |
|---|---|---|
| 缺少 mysqli 擴展 | PHP 未安裝/啟用 php-mysqli | apt install php8.1-mysqli && systemctl restart php8.1-fpm |
| blowfish_secret 不能為空 | config.inc.php 未設置 | 生成 32 字符隨機串填入 |
| 無法登錄 / Access denied | 用戶密碼錯、主機不匹配、Plugin 為 auth_socket | 檢查 MySQL 用戶:SELECT user,host,plugin FROM mysql.user;,改用 mysql_native_password |
| Token mismatch / 頁面過期 | Session 丟失、Cookie 域名不匹配、blowfish_secret 變更 | 檢查 session.save_path 權限、同域名訪問、固定 blowfish_secret |
| 上傳文件大小超過限制 | php.ini upload_max_filesize/post_max_size、Nginx client_max_body_size | 調大上述三處,重載服務 |
| 導出/導入超時 | 執行時間限制 | $cfg['ExecTimeLimit'] = 0; (config.inc.php) 或 php.ini max_execution_time |
pma_x7k9),或 Nginx location /secret_pma/ { alias ...; }。allow 1.2.3.4; deny all; 或 Apache Require ip 1.2.3.4。$cfg['TwoFactorAuthentication'] = true;。