在 Debian + LNMP(Linux + Nginx + MySQL/MariaDB + PHP) 环境中,连接数据库失败常见原因很多,下面按由浅入深给你一个排查清单,基本能覆盖 90% 的情况。
systemctl status mariadb
# 或
systemctl status mysql
如果没启动:
systemctl start mariadb
systemctl enable mariadb
检查你的 PHP 代码或配置文件:
$host = 'localhost';
$user = 'dbuser';
$pass = 'password';
$db = 'dbname';
✅ Debian 下注意:
localhost → 使用 Unix Socket127.0.0.1 → 使用 TCP如果 MySQL 没开 TCP,用 localhost 反而可能失败。
✅ 建议先测试:
$host = '127.0.0.1';
登录数据库:
mysql -u root -p
查看用户权限:
SELECT user, host FROM mysql.user;
如果用户只允许 localhost:
GRANT ALL PRIVILEGES ON dbname.* TO 'dbuser'@'localhost';
FLUSH PRIVILEGES;
如果是 PHP 通过 Nginx + PHP-FPM 连接,确认不是 127.0.0.1 和 localhost 混用。
查看监听端口:
ss -lntp | grep 3306
如果 没有监听 3306:
nano /etc/mysql/mariadb.conf.d/50-server.cnf
确认:
bind-address = 127.0.0.1
# 或
bind-address = 0.0.0.0
修改后重启:
systemctl restart mariadb
php -m | grep mysql
Debian 常见包:
apt install php-mysql
systemctl restart php-fpm
查看 socket 位置:
mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';"
PHP 中指定 socket:
new PDO('mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=dbname', 'user', 'pass');
ps aux | grep php-fpm
PHP-FPM 用户通常是:
www-data
确保 socket 或数据库权限允许 www-data 访问。
iptables -L
Debian 默认不启用 SELinux,一般不是它的问题。
mysql -u dbuser -p -h 127.0.0.1 dbname
如果命令行能连,PHP 连不上 → PHP 配置问题
如果命令行也连不上 → 数据库权限 / 服务问题
| 错误信息 | 原因 |
|---|---|
Access denied |
用户名 / 密码 / 权限 |
Unknown database |
数据库不存在 |
Connection refused |
服务未启动 / 端口 |
No such file or directory |
Socket 路径错误 |
Too many connections |
连接数爆满 |
你可以直接贴出:
我可以 精确告诉你哪一步错了 ✅