如何在Nginx+PHP环境下快速完成MySQL环境搭建 LAMP环境搭建及数据库连接测试

3次阅读

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

如何在Nginx+PHP环境下快速完成MySQL环境搭建 LAMP环境搭建及数据库连接测试

确认 PHP 是否已启用 MySQL 扩展

Nginx 本身不处理 PHP,依赖 php-fpm;而 PHP 连 MySQL 的前提是已加载对应扩展。常见错误是 PHP 编译时没带 mysqlnd,或配置中禁用了 mysqlipdo_mysql

  • 运行 php -m | grep -E 'mysqli|pdo_mysql',若无输出,说明扩展未启用
  • 检查 php.ini(可通过 php --ini 查路径),确保有:
    extension=mysqliextension=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 mysqldcentos/RHEL)或 mysql.serviceubuntu/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 连接(避开框架干扰)

别急着跑 laravelwordpress,先用最简脚本验证底层通路。重点看错误是否来自连接、认证还是查询阶段。

  • 新建 /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 statusfirewall-cmd --list-all
    access denied for user → 用户名/密码错,或 host 不匹配(注意 localhost127.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_NAMEPATH_INFO,否则 $_SERVER['PATH_INFO'] 为空,部分 ORM 或路由逻辑崩
  • 务必检查 php-fpm pool 配置里的 listen.owner / listen.group 是否与 Nginx worker 进程用户(通常是 www-datanginx)一致,否则 socket 权限拒绝,报 connect() to unix:/run/php/php-fpm.sock failed

实际连通的关键不在命令,而在每层之间“身份对得上”:PHP 知道怎么找 MySQL,MySQL 认得 PHP 来自哪台机器和哪个用户,Nginx 又确实把请求完整交给了 PHP-FPM。漏掉任一环,错误信息都可能误导你去调别的地方。

text=ZqhQzanResources