需依次确认:1. php 已启用 mysqli 和 pdo_mysql 扩展;2. mysql 服务运行且用户授权正确;3. php 脚本能直连验证;4. nginx 与 php-fpm 权限及路由配置无误。

确认 PHP 是否已启用 MySQL 扩展
Nginx 本身不处理 PHP,依赖 php-fpm;而 PHP 连 MySQL 的前提是已加载对应扩展。常见错误是 PHP 编译时没带 mysqlnd,或配置中禁用了 mysqli 和 pdo_mysql。
- 运行
php -m | grep -E 'mysqli|pdo_mysql',若无输出,说明扩展未启用 - 检查
php.ini(可通过php --ini查路径),确保有:extension=mysqli和extension=pdo_mysql - 修改后必须重启
php-fpm(如sudo systemctl restart php-fpm),不是 reload - 注意:PHP 8.0+ 已移除
mysql(非mysqli)扩展,硬写mysql_connect()会报Fatal error: Uncaught Error: Call to undefined function mysql_connect()
MySQL 服务启动与基础权限配置
很多“连不上”问题其实卡在 MySQL 服务没起来,或用户没授权从 Nginx 所在主机访问。
- 先确认服务状态:
sudo systemctl status mysqld(CentOS/RHEL)或mysql.service(Ubuntu/Debian) - 首次安装后需运行
sudo mysql_secure_installation设置 root 密码并清理默认风险账户 - 创建应用专用用户(别用 root 连 Web 应用):
CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'strong_pass';GRANT ALL ON myapp_db.* TO 'webuser'@'localhost';FLUSH PRIVILEGES; - 若 PHP 与 MySQL 不在同一台机器(如 Docker 分离部署),需把
'localhost'换成具体 IP 或'%',并确认 MySQL 绑定地址不是127.0.0.1(检查bind-address在/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf)
在 PHP 中测试 MySQL 连接(避开框架干扰)
别急着跑 Laravel 或 WordPress,先用最简脚本验证底层通路。重点看错误是否来自连接、认证还是查询阶段。
- 新建
/var/www/html/test_db.php,内容如下:
<?php
$host = 'localhost';
$db = 'myapp_db';
$user = 'webuser';
$pass = 'strong_pass';
<p>// 测试 mysqli 面向对象方式
$mysqli = new mysqli($host, $user, $pass, $db);
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
echo "MySQL 连接成功!版本:" . $mysqli->server_info;</p><p>// 可选:再试 PDO
try {
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass);
echo " — PDO 也 OK";
} catch (PDOException $e) {
echo "PDO 失败:" . $e->getMessage();
}
?>- 浏览器访问
http://your-server-ip/test_db.php,观察输出 - 典型失败反馈:
—Connection refused→ MySQL 没启动或端口被防火墙拦(检查sudo ufw status或firewall-cmd --list-all)
—Access denied for user→ 用户名/密码错,或 host 不匹配(注意localhost和127.0.0.1在 MySQL 中行为不同)
—Unknown database→ 库还没创建,用CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Nginx + PHP-FPM 的 PATH_INFO 与 .php 路由陷阱
看似数据库连上了,但 Web 请求一多就 502 或空白页?常因 Nginx 配置没正确透传请求给 PHP-FPM,导致 $_SERVER['PHP_SELF'] 异常、PDO 构造失败或自动加载出错。
立即学习“PHP免费学习笔记(深入)”;
- 标准 PHP 处理块应包含
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;,而非过时的$document_root$fastcgi_script_name - 若项目用 PATH_INFO(如
/index.php/api/user),需开启fastcgi_split_path_info并设置SCRIPT_NAME和PATH_INFO,否则$_SERVER['PATH_INFO']为空,部分 ORM 或路由逻辑崩 - 务必检查
php-fpmpool 配置里的listen.owner/listen.group是否与 Nginx worker 进程用户(通常是www-data或nginx)一致,否则 socket 权限拒绝,报connect() to unix:/run/php/php-fpm.sock failed
实际连通的关键不在堆命令,而在每层之间“身份对得上”:PHP 知道怎么找 MySQL,MySQL 认得 PHP 来自哪台机器和哪个用户,Nginx 又确实把请求完整交给了 PHP-FPM。漏掉任一环,错误信息都可能误导你去调别的地方。











