phpMyAdmin 是管理 MariaDB 和 MySQL 的便捷网页界面,但同时也是互联网上被扫描最多的网址之一。本指南在你的 VPS Linux Infrawire 上演示两种安装方式:使用 apt 软件包搭配 Apache,以及在 Nginx 后手动安装,随后介绍把机器人挡在门外的防护措施。
📋 前提条件
- 一台运行 Ubuntu 24.04 或 Debian 12、拥有 root 或
sudo权限的 VPS(IP 和 root 密码可在客户区查看) - 已可用的 LAMP(方案 A)或 LEMP(方案 B)环境,并带有 MariaDB
- 你自己的公网 IP,下文称为
ADMIN_IP
1. 方案 A:用 apt 软件包搭配 Apache
Bashapt update apt install -y phpmyadmin php-mbstring php-zip php-gd php-curl
在安装程序中,用空格键选中 apache2(必须出现星号),然后对“使用 dbconfig-common 配置数据库”回答“是”,并为 phpMyAdmin 内部账户设置密码。接着重新加载 Apache:
Bashphpenmod mbstring systemctl reload apache2
现在可通过 http://VPS_IP/phpmyadmin 访问 phpMyAdmin。
2. 创建专用的数据库用户
切勿以 root 登录。在 Ubuntu 和 Debian 的 MariaDB 上,root 使用 unix_socket 认证,phpMyAdmin 本来就会拒绝它:保持原样,另建一个普通账户即可。
Bashmariadb
SQLCREATE USER 'pmauser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; GRANT ALL PRIVILEGES ON appdb.* TO 'pmauser'@'localhost'; FLUSH PRIVILEGES; EXIT;
只授予该用户实际管理的数据库的权限。不要在配置中启用 AllowNoPassword。
3. 隐藏网址并添加认证(Apache)
把默认别名改成随机值,并创建密码文件:
BashSUFFIX=$(openssl rand -hex 6); echo "pma-$SUFFIX" sed -i "s#Alias /phpmyadmin#Alias /pma-$SUFFIX#" /etc/phpmyadmin/apache.conf htpasswd -c /etc/phpmyadmin/.htpasswd USER
然后把下面几行加入 /etc/phpmyadmin/apache.conf 中已有的 <Directory /usr/share/phpmyadmin> 块内:
Apache1AuthType Basic 2AuthName 'Restricted area' 3AuthUserFile /etc/phpmyadmin/.htpasswd 4<RequireAll> 5 Require valid-user 6 Require ip ADMIN_IP 7</RequireAll>
没有 <RequireAll> 时,Apache 只要满足任一条件即放行;加上它之后,密码和 IP 两者都必须满足。
Bashapache2ctl configtest && systemctl reload apache2
4. 方案 B:在 Nginx 后手动安装
先安装依赖,再从 phpMyAdmin 官方网站下载最新版本(把 VERSION 替换为当前版本号):
Bashapt install -y nginx php-fpm php-mysql php-mbstring php-xml php-zip php-gd php-curl apache2-utils cd /tmp wget https://files.phpmyadmin.net/phpMyAdmin/VERSION/phpMyAdmin-VERSION-all-languages.tar.gz tar xzf phpMyAdmin-VERSION-all-languages.tar.gz mkdir -p /var/www/pma mv phpMyAdmin-VERSION-all-languages /var/www/pma/pma-SECRET cd /var/www/pma/pma-SECRET cp config.sample.inc.php config.inc.php openssl rand -hex 16
把 pma-SECRET 换成随机名称。编辑 config.inc.php,把生成的值(32 个字符)粘贴为密钥:
PHP$cfg['blowfish_secret'] = 'RANDOM_32_CHARS'; $cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';
Bashmkdir -p /var/lib/phpmyadmin/tmp chown www-data:www-data /var/lib/phpmyadmin/tmp chmod 700 /var/lib/phpmyadmin/tmp chown -R root:www-data /var/www/pma chmod 640 /var/www/pma/pma-SECRET/config.inc.php htpasswd -c /etc/nginx/.htpasswd USER
把下面的块加入你站点的 server { ... } 中。在 Debian 12 上,套接字是 php8.2-fpm.sock,而不是 php8.3-fpm.sock:
Nginx1location ^~ /pma-SECRET/ { 2 allow ADMIN_IP; 3 deny all; 4 auth_basic 'Restricted area'; 5 auth_basic_user_file /etc/nginx/.htpasswd; 6 root /var/www/pma; 7 index index.php; 8 9 location ~ \.php$ { 10 include snippets/fastcgi-php.conf; 11 fastcgi_pass unix:/run/php/php8.3-fpm.sock; 12 } 13}
Bashnginx -t && systemctl reload nginx
5. 最安全的方式:SSH 隧道
如果不想对外暴露,就让界面只能从 VPS 本机访问,并从你的电脑建立隧道:
Bashssh -L 8080:127.0.0.1:80 USER@VPS_IP
会话保持打开期间,访问 http://127.0.0.1:8080/pma-SECRET/。在 Apache 中,把块里的 Require ip ADMIN_IP 改为 Require local;在 Nginx 中使用 allow 127.0.0.1;。这也解决了家庭 IP 经常变化的问题。
6. 验证防护效果
Bashcurl -sI http://VPS_IP/phpmyadmin | head -n 1 curl -sI http://VPS_IP/pma-SECRET/ | head -n 1
第一个请求必须返回 404。第二个请求在 ADMIN_IP 以外的任何 IP 上返回 403,在你的 IP 上则返回 401,直到你提供基本认证密码。此外,请只通过 HTTPS 提供 phpMyAdmin,否则密码会以明文传输。
🛠️ 故障排查
404 Not Found。 别名或 location 名称与你输入的网址不符,或者没有重新加载 Web 服务器。
你自己得到 403 Forbidden。 你的公网 IP 已变化。更新 ADMIN_IP,或改用 SSH 隧道。
“The mbstring extension is missing” 或空白页。 安装 php-mbstring,然后运行 phpenmod mbstring(Apache)或重启 php8.3-fpm(Nginx)。
root 提示 Access denied。 这是预期且理想的行为。请使用第 2 步创建的专用用户登录。
🎉 phpMyAdmin 已安装、隐藏并受到限制:只有你能访问自己的数据库。