一、架构核心认知
1. LNMP 与 LNAMP 架构定义
- LNMP:Linux(操作系统)+ Nginx(高性能 Web 服务器)+ MySQL/MariaDB(关系型数据库)+ PHP/Python(脚本语言),轻量级高并发架构,适合静态资源多、高访问量的场景。
- LNAMP :Linux + Nginx + Apache + MySQL/MariaDB + PHP/Python,混合架构结合 Nginx 高并发处理静态资源的优势,以及 Apache 对动态脚本、各类插件的良好兼容性,通过动静分离 和反向代理实现性能与兼容性的兼顾,适用于中大型网站、电商、社交平台等复杂业务场景。
2. 动静分离核心原理
Nginx 作为前端反向代理服务器,直接处理静态资源 (图片、CSS、JS、HTML 等),并将动态请求(PHP 脚本)转发给后端 Apache 服务器处理,数据库单独提供数据存储服务,各组件各司其职,提升整体服务响应速度和扩展性。
二、实验环境准备
本次实验需两台 Linux 主机,基础配置建议 2C4G,系统为 CentOS/RHEL 8+,网络互通,关闭防火墙和 SELinux(实验环境):
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
表格
| 主机 IP | 部署服务 | 作用 |
|---|---|---|
| 192.168.10.101 | Nginx | 前端反向代理、处理静态资源 |
| 192.168.10.102 | Apache+PHP+MySQL | 后端处理动态请求、数据存储 |
三、LNMP 架构部署(单主机,以 Discuz 论坛为例)
本部分实现单主机 LNMP 环境搭建,并部署开源 Discuz! 社区论坛,涵盖 Nginx、MySQL、PHP-FPM 的编译安装、配置及协同验证。
3.1 编译安装 Nginx(1.26.3)
Nginx 源码编译需安装依赖库,指定运行用户,开启常用功能模块,添加系统服务实现开机自启。
(1)安装编译依赖
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
(2)创建运行用户和日志目录
useradd -M -s /sbin/nologin nginx
mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx
(3)源码编译安装
# 下载并解压源码
wget https://nginx.org/download/nginx-1.26.3.tar.gz
tar zxf nginx-1.26.3.tar.gz
cd nginx-1.26.3
# 配置编译参数,开启核心模块
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream
# 编译并安装
make && make install
# 创建软链接,方便系统调用
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
(4)添加 Nginx 系统服务
vim /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target
[Service]
Type=forking
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root
[Install]
WantedBy=multi-user.target
刷新服务并启动:
systemctl daemon-reload
systemctl start nginx && systemctl enable nginx
# 验证启动状态
systemctl status nginx
3.2 安装并配置 MySQL 服务
采用 dnf 快速安装,避免源码编译耗时,安装后重置 root 密码,开启服务。
# 安装MySQL
dnf install mysql mysql-server -y
# 启动并开机自启
systemctl start mysqld && systemctl enable mysqld
# 登录MySQL(默认密码为空,直接回车)
mysql -uroot -p
# 重置root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Aptech1!';
# 刷新权限
flush privileges;
# 退出
exit
3.3 源码安装 PHP-FPM(8.2.20)
PHP-FPM 是 PHP 的 FastCGI 进程管理器,专为高并发设计,是 Nginx 处理 PHP 动态请求的核心组件,需源码编译安装并优化进程参数。
(1)安装编译依赖
dnf install -y gcc make cmake autoconf libtool bison re2c gcc-c++ openssl-devel libxml2-devel zlib-devel curl-devel libpng-devel libjpeg-turbo-devel freetype-devel libicu-devel oniguruma-devel sqlite-devel libxslt-devel libzip-devel pcre-devel apr-devel apr-util-devel ncurses-devel wget
(2)源码编译安装 PHP
# 下载并解压源码
wget https://www.php.net/distributions/php-8.2.20.tar.gz
tar xzf php-8.2.20.tar.gz
cd php-8.2.20
# 配置编译参数
./configure --prefix=/usr/local/php \
--with-openssl \
--with-zlib \
--with-curl \
--enable-mbstring \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-freetype \
--with-jpeg \
--with-zip \
--with-libxml \
--enable-intl \
--enable-gd \
--enable-opcache \
--enable-fpm
# 多核编译(提升速度)
make -j$(nproc) && make install
(3)配置 PHP 核心文件
# 复制配置文件模板
cp php.ini-development /usr/local/php/lib/php.ini
# 设置时区为上海
sed -i 's/;date.timezone=/date.timezone = Asia\/Shanghai/' /usr/local/php/lib/php.ini
# 调整内存限制为256M
sed -i 's/memory_limit = 128M/memory_limit = 256M/' /usr/local/php/lib/php.ini
# 配置PHP-FPM主配置文件
mv /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
mv /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
(4)创建 PHP 运行用户并修改 FPM 配置
# 创建用户
useradd -M -s /sbin/nologin php
# 修改FPM运行用户
vim /usr/local/php/etc/php-fpm.d/www.conf
# 找到以下两行,修改为php
user = php
group = php
(5)添加 PHP-FPM 系统服务
vim /etc/systemd/system/php-fpm.service
写入以下内容:
[Unit]
Description=PHP FastCGI Process Manager
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
PIDFile=/usr/local/php/var/run/php-fpm.pid
[Install]
WantedBy=multi-user.target
启动并开机自启:
systemctl daemon-reload
systemctl start php-fpm && systemctl enable php-fpm
(6)PHP-FPM 进程参数优化
FPM 进程有static(固定进程数)和dynamic(动态进程数)两种启动方式,dynamic更适合资源有限的场景,需根据服务器内存调整参数(以 1.5G 内存为例):
vim /usr/local/php/etc/php-fpm.d/www.conf
修改以下参数:
pm=dynamic
pm.max_children=20 # 最大进程数,根据内存调整
pm.start_servers=5 # 启动初始进程数
pm.max_spare_servers=8# 最大空闲进程数
pm.min_spare_servers=2# 最小空闲进程数
重启 PHP-FPM 生效:
systemctl restart php-fpm
3.4 验证 LNMP 协同工作
(1)配置 Nginx 支持 PHP 解析
vim /usr/local/nginx/conf/nginx.conf
在server块中添加 / 修改以下配置:
location / {
root html;
index index.html index.htm index.php; # 添加index.php为默认首页
}
# 配置PHP请求解析
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000; # 转发至PHP-FPM监听端口
fastcgi_index index.php;
include fastcgi.conf; # 加载FastCGI配置文件
}
检查配置并重启 Nginx:
nginx -t # 检查配置语法
nginx -s reload # 重启Nginx
(2)测试 PHP 环境
vim /usr/local/nginx/html/index.php
写入测试代码:
<?php
phpinfo();
?>
浏览器访问http://服务器IP/index.php,可看到 PHP 环境信息,说明 Nginx 与 PHP-FPM 协同正常。
(3)测试 PHP 连接 MySQL
vim /usr/local/nginx/html/index.php
替换为数据库连接测试代码:
<?php
$link=mysqli_connect('127.0.0.1','root','Aptech1!');
if($link)
echo"恭喜你,数据库连接成功啦!!";
mysqli_close($link);
?>
浏览器访问该地址,显示数据库连接成功,说明 LNMP 三组件协同正常。
3.5 部署 Discuz! 社区论坛
(1)准备论坛源码并配置权限
# 创建论坛目录
mkdir -p /usr/local/nginx/html/bbs
# 下载并解压Discuz源码(以X3.5为例)
wget https://download.comsenz.com/DiscuzX/3.5/Discuz-X3.5-SC-UTF8-v20231001.zip
unzip Discuz-X3.5-SC-UTF8-v20231001.zip
# 复制源码到论坛目录
cp -ra upload/* /usr/local/nginx/html/bbs/
# 复制配置文件模板
cd /usr/local/nginx/html/bbs/config/
cp config_global_default.php config_global.php
cp config_ucenter_default.php config_ucenter.php
# 设置目录权限为PHP运行用户
chown php:php /usr/local/nginx/html/bbs/ -R
(2)配置 PHP 连接 MySQL 的 sock 文件
vim /usr/local/php/lib/php.ini
添加以下配置,防止数据库连接失败:
mysqli.default_socket = /var/lib/mysql/mysql.sock
pdo_mysql.default_socket = /var/lib/mysql/mysql.sock
重启 PHP-FPM:
systemctl restart php-fpm
(3)创建 Discuz 专用数据库和用户
# 登录MySQL
mysql -uroot -pAptech1!
# 创建数据库,指定字符集为utf8mb4
CREATE DATABASE discuz_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 创建专用用户并设置密码
CREATE USER 'discuz_user'@'localhost' IDENTIFIED BY 'pwd123';
# 授权用户操作该数据库的所有权限
GRANT ALL PRIVILEGES ON discuz_db.* TO 'discuz_user'@'localhost';
# 刷新权限
FLUSH PRIVILEGES;
# 退出
exit
(4)网页端安装 Discuz
浏览器访问http://服务器IP/bbs/install,按照安装向导完成 3 步操作:
- 检查运行环境(自动通过,若有报错根据提示调整权限);
- 填写数据库信息(数据库名 discuz_db、用户名 discuz_user、密码 pwd123);
- 设置管理员账号和密码,完成安装。
四、LNAMP 架构部署(双主机,动静分离)
本部分实现双主机 LNAMP 动静分离架构,Nginx(192.168.10.101)处理静态资源并反向代理动态请求,Apache+PHP+MySQL(192.168.10.102)处理动态请求并提供数据存储。
4.1 配置 Nginx 反向代理(192.168.10.101)
(1)安装 Nginx(dnf 快速安装)
dnf install -y nginx
(2)配置 Nginx 动静分离和反向代理
cp /etc/nginx/nginx.conf.default /etc/nginx/nginx.conf
vim /etc/nginx/nginx.conf
修改server块配置:
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.php;
# 处理静态资源,设置7天缓存
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
expires 7d;
}
# 动态PHP请求转发给后端Apache服务器
location ~ \.php$ {
proxy_pass http://192.168.10.102:80; # 后端Apache主机IP
proxy_set_header Host $host; # 传递请求Host信息
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理IP链
}
}
(3)创建静态资源目录并放入测试图片
mkdir -p /usr/share/nginx/html/images
# 放入测试图片(可自行上传或下载)
cp kgc.png /usr/share/nginx/html/images/
# 启动Nginx并开机自启
systemctl start nginx && systemctl enable nginx
4.2 搭建 LAMP 环境(192.168.10.102)
采用 dnf 快速安装 Apache、PHP、MySQL,无需源码编译,适合快速部署。
# 安装LAMP组件
dnf install -y httpd php php-mysqlnd mysql mysql-server
# 启动服务并开机自启
systemctl start httpd && systemctl enable httpd
systemctl start mysqld && systemctl enable mysqld
# 重置MySQL root密码
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Aptech1!';
flush privileges;
exit
4.3 配置动态页面和测试数据库(192.168.10.102)
(1)编写 PHP 动态测试页面
vim /var/www/html/test.php
写入以下代码(连接 MySQL 查询数据,并嵌入 Nginx 的静态图片):
<?php
$servername = "127.0.0.1";
$username = "testuser";
$password = "Test@123";
$dbname = "testdb";
// 创建数据库连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("数据库连接失败: " . $conn->connect_error);
}
// 查询用户表数据
$sql = "SELECT id, name FROM users";
$result = $conn->query($sql);
// 输出查询结果
if ($result->num_rows > 0) {
echo "<h1>用户列表</h1>";
echo "<ul>";
while ($row = $result->fetch_assoc()) {
echo "<li>ID: " . $row["id"] . " - 姓名: " . $row["name"] . "</li>";
}
echo "</ul>";
} else {
echo "0 结果";
}
// 关闭连接
$conn->close();
// 嵌入Nginx的静态图片(Nginx直接处理)
echo "<img src='/images/kgc.png' alt='测试图片'>";
?>
(2)创建测试数据库、用户和数据表
# 登录MySQL
mysql -uroot -pAptech1!
# 创建数据库
CREATE DATABASE testdb;
# 创建专用用户
CREATE USER 'testuser'@'127.0.0.1' IDENTIFIED BY 'Test@123';
# 授权用户权限
GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'127.0.0.1';
FLUSH PRIVILEGES;
# 进入数据库
USE testdb;
# 创建用户表
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR (50));
# 插入测试数据
INSERT INTO users (name) VALUES('张三'),('李四'),('王五');
# 退出
exit
4.4 验证 LNAMP 动静分离效果
浏览器访问http://192.168.10.101/test.php(Nginx 服务器 IP),页面将显示:
- 动态内容:从 192.168.10.102 的 MySQL 中查询的用户列表(Apache 处理);
- 静态内容:由 192.168.10.101 的 Nginx 直接返回的测试图片(静态资源)。
同时可查看 Apache 日志,验证动态请求记录:
tail -f /var/log/httpd/access_log
五、核心补充知识点
5.1 Nginx 核心模块作用
http_ssl_module:启用 HTTPS,实现加密传输;http_realip_module:获取客户端真实 IP,解决代理场景下 IP 显示异常问题;http_gzip_static_module:开启静态资源压缩,减少网络传输量;stream_module:支持四层 TCP/UDP 代理,可用于数据库、Redis 等服务的代理。
5.2 PHP-FPM 进程管理关键参数
pm:进程管理方式,static适合高配置服务器,dynamic适合资源有限场景;pm.max_children:最大进程数,若设置过小会导致请求排队,过大则占用过多内存;pm.start_servers:初始启动进程数,建议为pm.max_children的 1/4~1/2。
5.3 动静分离的优势
- 提升性能:Nginx 处理静态资源的效率远高于 Apache,单独处理可减少 Apache 压力;
- 易于扩展:静态资源可部署至 CDN,动态服务可横向扩容多台 Apache 服务器;
- 降低耦合:静态和动态资源分开部署,便于单独维护和升级。
5.4 数据库安全最佳实践
- 避免使用 root 用户操作业务数据库,创建专用低权限用户,仅授权对应数据库;
- 数据库密码设置复杂(字母 + 数字 + 特殊符号),定期更换;
- 禁止数据库直接暴露公网,仅允许应用服务器内网访问。
5.5 LNMP/LNAMP 架构故障排查要点
- Nginx :查看日志
/var/log/nginx/error.log,检查配置语法nginx -t; - PHP-FPM :查看日志
/usr/local/php/var/log/php-fpm.log,检查端口监听netstat -tulnp | grep 9000; - MySQL :查看日志
/var/log/mysqld.log,检查端口监听netstat -tulnp | grep 3306; - Apache :查看日志
/var/log/httpd/error_log,检查端口监听netstat -tulnp | grep 80。
六、架构总结
- LNMP 架构轻量高效,适合小型网站、个人博客、高并发静态站点,部署简单,资源占用低;
- LNAMP 架构通过动静分离和反向代理,结合 Nginx 和 Apache 的优势,适合中大型企业级应用,兼顾性能与兼容性;
- 两种架构的核心是各组件各司其职,通过合理的配置和优化(如 PHP-FPM 进程、Nginx 缓存、数据库索引),可大幅提升 Web 服务的稳定性和响应速度。
部署时需根据业务规模、资源配置、访问量选择合适的架构,同时做好服务监控、日志收集和安全防护,保障生产环境的稳定运行。