当前位置: 首页 > news >正文

LNMP架构(分离部署)PHP与数据库交互示例

LNMP架构(分离部署)PHP与数据库交互示例

基于你的三台服务器地址:

  • 数据库服务器(MySQL):192.168.100.10
  • Nginx服务器:192.168.100.20
  • PHP服务器:192.168.100.30

下面将通过一个"用户信息查询"的简单例子,展示如何实现跨服务器的PHP与数据库交互。

一、数据库服务器(192.168.100.10)配置

1. 登录MySQL并创建测试数据

# 登录MySQL
mysql -uroot -predhat

执行以下SQL语句:

-- 创建测试数据库
CREATE DATABASE IF NOT EXISTS demo_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 创建专门用于PHP连接的用户(仅允许从PHP服务器IP连接)
CREATE USER 'root'@'192.168.100.30' IDENTIFIED BY 'redhat';
GRANT SELECT, INSERT, UPDATE ON demo_db.* TO 'root'@'192.168.100.30';
FLUSH PRIVILEGES;-- 切换到demo_db数据库
USE demo_db;-- 创建用户表
CREATE TABLE IF NOT EXISTS users (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(50) NOT NULL COMMENT '用户名',age INT(3) NOT NULL COMMENT '年龄',email VARCHAR(100) UNIQUE NOT NULL COMMENT '邮箱',PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 插入测试数据
INSERT INTO users (name, age, email) VALUES
('张三', 25, 'zhangsan@example.com'),
('李四', 30, 'lisi@example.com'),
('王五', 28, 'wangwu@example.com');

2. 配置MySQL允许远程连接

# 编辑MySQL配置文件
vim /etc/my.cnf# 注释掉bind-address(如果存在)
# bind-address = 127.0.0.1# 重启MySQL
systemctl restart mysqld# 开放3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

二、PHP服务器(192.168.100.30)配置

1. 安装PHP MySQL扩展

# 安装PHP MySQL扩展
yum -y install php-mysqlnd php-pdo# 重启PHP-FPM
systemctl restart php-fpm# 开放9000端口(PHP-FPM默认端口)
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --reload

2. 创建PHP测试脚本

# 创建网站根目录
mkdir -p /var/www/html# 创建测试脚本
vim /var/www/html/user_query.php

脚本内容:

<?php
// 数据库连接配置(使用数据库服务器IP)
$dbConfig = ['host' => '192.168.100.10',  // 数据库服务器IP'dbname' => 'demo_db',       // 数据库名'username' => 'root',    // 数据库用户'password' => 'redhat',  // 数据库密码'port' => 3306               // 数据库端口
];try {// 建立数据库连接(PDO方式,推荐)$dsn = "mysql:host={$dbConfig['host']};dbname={$dbConfig['dbname']};port={$dbConfig['port']};charset=utf8mb4";$pdo = new PDO($dsn,$dbConfig['username'],$dbConfig['password'],[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);// 1. 查询所有用户$stmt = $pdo->query("SELECT * FROM users");$users = $stmt->fetchAll();// 2. 插入新用户(演示)$newUser = ['name' => '赵六','age' => 35,'email' => 'zhaoliu@example.com'];$insertStmt = $pdo->prepare("INSERT INTO users (name, age, email) VALUES (?, ?, ?)");$insertSuccess = $insertStmt->execute([$newUser['name'], $newUser['age'], $newUser['email']]);} catch (PDOException $e) {// 捕获连接或查询错误die("数据库操作失败:" . $e->getMessage());
}
?>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>PHP与MySQL交互示例</title><style>body { font-family: Arial, sans-serif; margin: 20px; }.container { max-width: 800px; margin: 0 auto; }.user-table { width: 100%; border-collapse: collapse; margin-top: 20px; }.user-table th, .user-table td { border: 1px solid #ddd; padding: 8px; text-align: left; }.user-table th { background-color: #f2f2f2; }.success { color: green; }.error { color: red; }</style>
</head>
<body><div class="container"><h1>用户信息列表</h1><?php if (isset($insertSuccess) && $insertSuccess): ?><p class="success">新用户"<?php echo $newUser['name']; ?>"插入成功!</p><?php endif; ?><?php if (!empty($users)): ?><table class="user-table"><tr><th>ID</th><th>姓名</th><th>年龄</th><th>邮箱</th></tr><?php foreach ($users as $user): ?><tr><td><?php echo $user['id']; ?></td><td><?php echo $user['name']; ?></td><td><?php echo $user['age']; ?></td><td><?php echo $user['email']; ?></td></tr><?php endforeach; ?></table><?php else: ?><p class="error">没有查询到用户数据</p><?php endif; ?></div>
</body>
</html>

设置文件权限:

# 设置正确权限
chown -R apache:apache /var/www/html  # 若PHP-FPM运行用户为apache
# 或 chown -R nginx:nginx /var/www/html  # 若PHP-FPM运行用户为nginx

三、Nginx服务器(192.168.100.20)配置

1. 安装Nginx(若未安装)

安装nginx-1.24.0

2. 配置Nginx反向代理到PHP服务器

# 创建站点配置文件
vim /usr/local/nginx/conf/nginx.conf

配置内容:

server {listen 80;server_name localhost;  # 可替换为实际域名# 开放文件上传大小限制client_max_body_size 10M;# 所有请求转发到PHP服务器处理location / {# 代理到PHP服务器的9000端口(PHP-FPM)fastcgi_pass 192.168.100.30:9000;# 设置PHP文件路径(PHP服务器上的实际路径)fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;include fastcgi_params;# 超时设置fastcgi_connect_timeout 30s;fastcgi_send_timeout 30s;fastcgi_read_timeout 30s;}# 日志配置error_log /var/log/nginx/demo_error.log;access_log /var/log/nginx/demo_access.log main;
}

3. 重启Nginx并开放端口

# 检查配置是否正确
nginx -t# 重启Nginx
systemctl restart nginx# 开放80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

四、测试效果

在本地电脑的浏览器中访问Nginx服务器地址:

http://192.168.100.20/user_query.php

预期效果:

  1. 页面会显示数据库中已有的3条用户信息(张三、李四、王五)
  2. 同时会插入一条新用户"赵六"的记录
  3. 表格会展示所有用户的ID、姓名、年龄和邮箱信息
  4. 在这里插入图片描述

验证数据是否真的插入:

在数据库服务器上执行:

mysql -uroot -predhat -e "SELECT * FROM demo_db.users;"

可以看到查询结果中包含"赵六"的记录,说明PHP与数据库交互成功。

在这里插入图片描述

五、常见问题排查

  1. 连接超时

    • 检查数据库服务器3306端口是否开放
    • 验证PHP服务器是否能ping通数据库服务器(ping 192.168.100.10
    • 检查数据库用户是否允许从PHP服务器IP连接(SELECT user,host FROM mysql.user;
  2. 权限错误

    • 确保PHP脚本文件权限正确
    • 检查PHP-FPM运行用户是否有访问脚本的权限
  3. Nginx 502错误

    • 检查PHP服务器9000端口是否开放
    • 确认PHP-FPM服务是否正常运行(systemctl status php-fpm
  4. 访问被拒绝,首先查明数据库用户有没有权限访问。

通过这个简单的例子,你可以清晰地看到LNMP分离架构中PHP如何与远程数据库进行交互,包括查询数据和插入数据的基本操作。

r,host FROM mysql.user;`)

  1. 权限错误

    • 确保PHP脚本文件权限正确
    • 检查PHP-FPM运行用户是否有访问脚本的权限
  2. Nginx 502错误

    • 检查PHP服务器9000端口是否开放
    • 确认PHP-FPM服务是否正常运行(systemctl status php-fpm
  3. 访问被拒绝,首先查明数据库用户有没有权限访问。

通过这个简单的例子,你可以清晰地看到LNMP分离架构中PHP如何与远程数据库进行交互,包括查询数据和插入数据的基本操作。

http://www.dtcms.com/a/404031.html

相关文章:

  • Git----常用指令入门
  • 传输无界 金士顿双接口U盘上新抽电脑
  • Real-Time MDNet
  • 从零开始:接入suno api V5.0模型:认识 Suno AI音乐 - 第1篇
  • wordpress成品图开封做网站优化
  • 陕西省住房建设厅官方网站开发软件需要多少成本
  • 软硬件基本相同的两个设备,AE表现不一致的原因定位
  • 湖南网站开发公司电话网络设计与制作
  • 天数智芯智铠100性能测试
  • datawhale玩转通义四大新模型 202509 第6次作业
  • 响应式品牌网站wordpress图片文字
  • 电子商城建设网站品牌建设实施纲要
  • 责任链设计模式详解
  • 学习2025.9.24
  • 视频 播放网站怎么做黄石企业网站建设
  • C#图像处理五大核心误区与解决方案‌
  • 珠海做网站公司哪家好国家住房与城乡建设部网站
  • 织梦做网站要多长时间免费那个网站
  • 新桥网站建设济南小程序网站制作
  • 一文读懂循环神经网络(RNN):原理、局限与LSTM解决方案
  • 以绿色为主的网站wordpress 单 中
  • Linux 企业级备份体系实战:cron/anacron/restic/rclone 对比与脚本总结
  • 做的网站太大怎么办神华科技 网站建设
  • 软件公司 网站建设费分录如何创建网站主页
  • 北京城乡和住房建设部网站济源新站seo关键词排名推广
  • 网站页脚的制作西部数码上传网站
  • 素材网站下载网店设计与装修
  • 《2025年AI产业发展十大趋势报告》六十七
  • 花生壳做网站需要备案西安制作标书的公司
  • 笔记本copilot按键映射为右Ctrl键的方法