Ubuntu PHP日志中的数据库连接问题怎么解决
小樊
40
2025-12-19 20:56:10
Ubuntu PHP 数据库连接问题的排查与修复
一 快速定位与日志定位
确认服务是否运行:检查 MySQL/MariaDB 与 PHP-FPM (或 Apache )状态,必要时重启服务。
命令示例:
sudo systemctl status mysql
sudo systemctl status php7.x -fpm
sudo systemctl restart mysql && sudo systemctl restart php7.x -fpm
查看错误日志:
MySQL 错误日志通常在 /var/log/mysql/error.log ;
PHP-FPM 日志在 /var/log/php 7.x**-fpm.log** 或 /var/log/php-fpm/error.log ;
Nginx 错误日志在 /var/log/nginx/error.log (LNMP 场景)。
命令示例:
sudo tail -f /var/log/mysql/error.log
sudo tail -f /var/log/php7.x -fpm.log
在 PHP 中输出连接错误以便快速定位:
MySQLi:
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) { die("Connect failed: " . $conn->connect_error); }
PDO:
try { new PDO(“mysql:host=$host;dbname=$db”, $user, $pass); }
catch (PDOException $e) { die("PDO Error: " . $e->getMessage()); }
以上步骤能迅速缩小问题范围,并获取明确的错误码与错误信息用于后续处理。
二 常见原因与对应修复
数据库服务未启动:启动 MySQL/MariaDB 并设为开机自启。
命令示例:sudo systemctl start mysql && sudo systemctl enable mysql
连接参数错误:核对 主机名/端口/用户名/密码/数据库名 ;本地优先用 127.0.0.1 (避免 localhost 走 Unix socket 引发误判),远程使用服务器 内网/公网 IP 与端口(默认 3306 )。
远程访问未放行:
MySQL 配置:编辑 /etc/mysql/mysql.conf.d/mysqld.cnf ,注释或调整 bind-address = 127.0.0.1 以允许远程;重启 MySQL。
防火墙:放行数据库端口(如 3306 )。
命令示例:sudo ufw allow 3306 /tcp
用户权限不足或主机限制:确保数据库用户可从 PHP 所在主机连接并具备相应权限。
示例:
SHOW GRANTS FOR ‘your_user’@‘your_host’;
GRANT ALL PRIVILEGES ON your_db.* TO ‘your_user’@‘your_host’;
FLUSH PRIVILEGES;
如需从任意主机连接,可使用 ‘your_user’@‘%’ (生产环境请限定来源网段)。
PHP 扩展缺失:安装并启用对应扩展(如 mysqli、pdo_mysql )。
命令示例:sudo apt-get install php7.x -mysql(或 php-mysql)。
以上为最常见且高命中率的故障面,逐项核对通常即可恢复连接。
三 不同运行环境的差异点
LAMP(Apache + PHP):确认 Apache 与 PHP 模块加载正常;修改 php.ini 后需重启 Apache 。
命令示例:sudo systemctl restart apache2
LNMP(Nginx + PHP-FPM):确认 PHP-FPM 与 Nginx 正常运行;Nginx 通过 fastcgi_pass 与 PHP-FPM 通信,配置变更后需重启两者。
命令示例:sudo systemctl restart nginx && sudo systemctl restart php7.x -fpm
SELinux/AppArmor:若启用,确认策略未阻断 3306 或 PHP-FPM 访问数据库套接字/端口。
主机名解析:本机测试可用 127.0.0.1 排除 DNS/hosts 问题;远程连接务必使用可达的 IP/域名 。
这些差异点决定了“服务重启对象”和“配置生效方式”,排查时需对应环境执行。
四 一键自检脚本与最小示例
最小连通性测试脚本(保存为 test_db.php ,访问触发后查看页面或 PHP 错误日志):connect_error) {
die("MySQLi Connect failed: " . $conn->connect_error);
}
echo "MySQLi OK";
$conn->close();
try {
$pdo = new PDO("mysql:host=$host;port=$port;dbname=$db", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo " | PDO OK";
} catch (PDOException $e) {
echo " | PDO Error: " . $e->getMessage();
}
?>
网络连通性测试(在 Web 服务器上执行):
telnet 数据库IP 3306 或 nc -vz 数据库IP 3306
若不通,优先检查云安全组/服务器防火墙与数据库 bind-address 配置。
该脚本可快速判断是凭据/扩展问题,还是网络/权限/配置问题。
五 高频错误码与处理要点
2002 Connection refused / Can’t connect to MySQL server :服务未启动、端口不对、监听地址限制或防火墙阻断。检查 systemctl status mysql 、bind-address 、以及 ufw/安全组 是否放行 3306 。
1045 Access denied for user :用户名或密码错误,或用户主机限制不匹配。核对凭据,使用 SHOW GRANTS 检查并调整用户主机(如 ‘user’@‘localhost’ 与 ‘user’@‘%’ 的区别)。
1130 Host ‘xxx’ is not allowed to connect to this MySQL server :数据库未授权该来源主机连接。为用户添加对应来源主机的权限或调整授权策略。
2006 MySQL server has gone away :超时/包过大/服务重启等。可适当增大 wait_timeout/max_allowed_packet ,或检查网络稳定性与服务状态。
结合错误码与日志定位,能显著缩短排障时间。