技能目标
- 掌握 LNMP 架构的完整部署流程
- 掌握 LNAMP 架构的动静分离实现原理与配置方法
前言
在互联网技术迭代升级的当下,LNMP(Linux+Nginx+MySQL/MariaDB+PHP/Python)与 LNAMP(Linux+Nginx+Apache+MySQL/MariaDB+PHP/Python)作为开源轻量级 Web 架构,凭借高并发处理能力、良好的兼容性和灵活的扩展特性,成为企业级 Web 应用部署的核心方案,广泛应用于电商平台、社区论坛、API 服务等各类业务场景。
本章节将围绕两种架构展开实操教学,帮助运维技术人员吃透架构核心原理,熟练完成从基础环境搭建、各服务配置到性能调优的全流程操作。通过对比 LNMP 轻量级高并发的优势与 LNAMP 混合架构的兼容性特点,让学习者能够根据实际业务的资源需求、访问量特征灵活选择技术架构,同时具备排查生产环境中常见服务故障、性能瓶颈的实战能力。
基于 LNMP 架构部署 Web 应用
此前已完成 LNMP 架构的基础认知与简单配置,本小节将以开源社区论坛程序PHPWind 为实例,完成 LNMP 架构的完整落地部署。PHPWind 是基于 PHP+MySQL 开发的开源社区论坛系统,具备功能完善、运行稳定、易扩展的特点,是国内主流的论坛搭建解决方案之一,官方网站为www.phpwind.net。
1. 编译安装 Nginx 服务
Nginx 运行依赖 pcre、zlib 等基础库支持,需通过源码编译方式安装,保证功能模块的自定义性。
(1)安装编译依赖包
bash
运行
[root@localhost ~]# dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
(2)创建专用运行用户及日志目录
为保证 Nginx 运行安全性,创建无登录权限的专用用户,并配置专属日志目录及权限:
bash
运行
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx:nginx /var/log/nginx
(3)源码编译安装 Nginx
本次选用 Nginx 1.28.0 版本,编译时启用 SSL、HTTP/2、状态监控等核心模块:
bash
运行
[root@localhost ~]# tar zxf nginx-1.28.0.tar.gz
[root@localhost ~]# cd nginx-1.28.0
[root@localhost nginx-1.28.0]# ./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
[root@localhost nginx-1.28.0]# make && make install
参数说明:
- --prefix=/usr/local/nginx:指定 Nginx 安装根目录
- --user/--group=nginx:指定 Nginx 运行的用户 / 用户组
- --with-http_ssl_module:启用 SSL 模块,支持 HTTPS 协议
- --with-http_v2_module:开启 HTTP/2 协议,提升访问速度
- --with-http_realip_module:获取客户端真实 IP 地址
- --with-http_stub_status_module:启用 Nginx 状态监控模块
- --with-http_gzip_static_module:启用静态资源 gzip 压缩,减小传输体积
- --with-stream:启用四层 TCP/UDP 代理功能
创建主程序软链接,方便系统全局调用:
bash
运行
[root@localhost nginx-1.28.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
(4)配置 Nginx 系统服务
通过 systemd 管理 Nginx 服务,实现开机自启、便捷的启停操作:
bash
运行
[root@localhost ~]# vim /lib/systemd/system/nginx.service
写入以下配置内容:
ini
[Unit]
Description=The NGINX HTTP and Reverse Proxy Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStartPre=/usr/local/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/local/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重新加载系统服务配置,启动并设置开机自启:
bash
运行
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx
2. 快速安装 MySQL 数据库服务
为提升部署效率,采用 dnf 包管理器方式安装 MySQL 服务,替代源码编译:
bash
运行
[root@localhost ~]# dnf install -y mysql mysql-server
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# systemctl enable mysqld
登录 MySQL 并重置 root 用户密码(默认无密码,直接回车登录):
bash
运行
[root@localhost ~]# mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Kgc@123456';
mysql> FLUSH PRIVILEGES;
mysql> exit
3. 源码编译安装 PHP-FPM 服务
PHP-FPM 是 PHP 的 FastCGI 进程管理工具,专为高并发场景设计,是 Nginx 处理 PHP 动态请求的核心组件,本次采用源码编译安装 PHP 8.3.0 版本。
(1)安装编译依赖环境
bash
运行
[root@localhost ~]# 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
bash
运行
[root@localhost ~]# tar xzf php-8.3.0.tar.gz
[root@localhost ~]# cd php-8.3.0
[root@localhost php-8.3.0]# ./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
[root@localhost php-8.3.0]# make -j$(nproc) && make install
(3)配置 PHP 核心文件
复制并修改 PHP 配置文件,设置时区、内存限制等核心参数:
bash
运行
[root@localhost php-8.3.0]# cp php.ini-development /usr/local/php/lib/php.ini
[root@localhost php-8.3.0]# sed -i 's/;date.timezone =/date.timezone = Asia\/Shanghai/' /usr/local/php/lib/php.ini
[root@localhost php-8.3.0]# sed -i 's/memory_limit = 128M/memory_limit = 512M/' /usr/local/php/lib/php.ini
(4)配置 PHP-FPM 服务
初始化 PHP-FPM 配置文件,创建专用运行用户并修改配置:
bash
运行
[root@localhost ~]# mv /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
[root@localhost ~]# mv /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
# 创建PHP-FPM专用运行用户
[root@localhost ~]# useradd -M -s /sbin/nologin php-fpm
# 修改运行用户
[root@localhost ~]# sed -i 's/user = nobody/user = php-fpm/' /usr/local/php/etc/php-fpm.d/www.conf
[root@localhost ~]# sed -i 's/group = nobody/group = php-fpm/' /usr/local/php/etc/php-fpm.d/www.conf
(5)配置 PHP-FPM 系统服务
bash
运行
[root@localhost ~]# vim /etc/systemd/system/php-fpm.service
写入以下配置:
ini
[Unit]
Description=The PHP FastCGI Process Manager
After=network.target mysqld.service
[Service]
Type=forking
ExecStart=/usr/local/php/sbin/php-fpm
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGQUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
(6)PHP-FPM 进程参数优化
PHP-FPM 进程分为static(固定进程数)和dynamic(动态进程数)两种启动模式,需根据服务器内存和业务负载调整。以2G 内存的论坛服务器为例,优化 dynamic 模式参数:
bash
运行
[root@localhost ~]# vim /usr/local/php/etc/php-fpm.d/www.conf
pm = dynamic
pm.max_children = 30 # 最大进程数
pm.start_servers = 8 # 启动初始进程数
pm.max_spare_servers = 15 # 最大空闲进程数
pm.min_spare_servers = 3 # 最小空闲进程数
启动 PHP-FPM 并设置开机自启:
bash
运行
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start php-fpm
[root@localhost ~]# systemctl enable php-fpm
4. 验证 LNMP 架构协同工作
通过编写测试文件,分别验证 Nginx 对 PHP 的解析能力、PHP 与 MySQL 的连接能力。
(1)验证 PHP 解析功能
在 Nginx 网站根目录创建 PHP 测试文件:
bash
运行
[root@localhost ~]# vim /usr/local/nginx/html/info.php
<?php
phpinfo();
?>
修改 Nginx 配置文件,开启 PHP 解析支持:
bash
运行
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
在server配置段中添加 / 修改以下内容:
nginx
location / {
root html;
index index.html index.htm index.php;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
检查配置文件语法并重新加载:
bash
运行
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
通过浏览器访问http://服务器IP/info.php,若能正常显示 PHP 环境信息,说明 Nginx 与 PHP-FPM 协同工作正常。
(2)验证 PHP 与 MySQL 连接能力
修改测试文件,编写 MySQL 连接代码:
bash
运行
[root@localhost ~]# vim /usr/local/nginx/html/info.php
<?php
$link = mysqli_connect('127.0.0.1','root','Kgc@123456');
if($link){
echo "MySQL数据库连接成功!";
}else{
echo "MySQL数据库连接失败:".mysqli_connect_error();
}
mysqli_close($link);
?>
浏览器访问该地址,若显示MySQL 数据库连接成功,说明三者协同工作正常。
5. 部署 PHPWind 论坛应用
(1)解压部署源码包
下载 PHPWind 源码包后,解压并将核心文件移至 Nginx 网站根目录,配置目录权限:
bash
运行
[root@localhost ~]# mkdir -p /usr/local/nginx/html/bbs
[root@localhost ~]# unzip PHPWind_9.0.1_UTF8.zip
[root@localhost ~]# cp -ra upload/* /usr/local/nginx/html/bbs/
# 修改目录所属用户,保证PHP-FPM的写入权限
[root@localhost ~]# chown -R php-fpm:php-fpm /usr/local/nginx/html/bbs/
(2)创建论坛专用数据库及用户
为提升数据库安全性,避免使用 root 用户直接连接应用,创建专用数据库和授权用户:
bash
运行
[root@localhost ~]# mysql -uroot -pKgc@123456
mysql> CREATE DATABASE phpwind_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
mysql> CREATE USER 'phpwind_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Phpwind@123';
mysql> GRANT ALL PRIVILEGES ON phpwind_db.* TO 'phpwind_user'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> exit
(3)完成论坛网页端安装
通过浏览器访问http://服务器IP/bbs/install,按照安装向导完成以下步骤:
- 环境检测:确认服务器环境满足 PHPWind 安装要求
- 数据库配置:填写创建的数据库名、用户名、密码
- 站点配置:设置论坛名称、管理员账号和密码
- 安装完成:删除安装目录,进入论坛后台或前台访问
LNAMP 架构部署与动静分离验证
LNAMP 架构融合了 Nginx 高并发处理静态资源的优势与 Apache 对 PHP 等动态脚本的良好兼容性,通过动静分离 + 反向代理技术,将静态资源由 Nginx 直接处理,动态请求转发至 Apache 服务器解析,大幅提升 Web 应用的访问速度和服务稳定性,适用于中大型高并发 Web 业务场景。
本次实验需准备两台 Linux 服务器,基础配置均为 2C4G,具体服务分工如下:
表格
| 操作系统 | 服务器 IP | 部署服务 | 功能定位 |
|---|---|---|---|
| CentOS 9 | 192.168.20.100 | Nginx | 反向代理 + 静态资源处理 |
| CentOS 9 | 192.168.20.101 | Apache+PHP+MySQL | 动态请求解析 + 数据存储 |
1. Nginx 服务器反向代理与静态资源配置
(1)安装并配置 Nginx 反向代理
bash
运行
[root@nginx ~]# dnf install -y nginx
[root@nginx ~]# systemctl stop firewalld && systemctl disable firewalld
[root@nginx ~]# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
[root@nginx ~]# vim /etc/nginx/nginx.conf
修改server配置段,实现静态资源本地处理、动态请求转发:
nginx
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.php;
# 处理静态资源(图片、CSS、JS、视频等)
location ~* \.(jpg|jpeg|png|gif|css|js|ico|mp4)$ {
expires 30d; # 静态资源缓存30天
add_header Cache-Control "public, max-age=2592000";
}
# 转发PHP动态请求至Apache服务器
location ~ \.php$ {
proxy_pass http://192.168.20.101:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
}
核心配置说明:
- proxy_pass:将 PHP 动态请求转发至 Apache 服务器 IP
- X-Real-IP/X-Forwarded-For:将客户端真实 IP 传递给后端 Apache 服务器
- expires:设置静态资源缓存时间,减少重复请求
(2)创建静态资源目录并上传文件
bash
运行
[root@nginx ~]# mkdir -p /usr/share/nginx/html/images
[root@nginx ~]# cp logo.png /usr/share/nginx/html/images/
[root@nginx ~]# systemctl start nginx && systemctl enable nginx
2. Apache 服务器搭建 LAMP 环境
在 192.168.20.101 服务器上,通过 dnf 快速搭建 LAMP 环境,处理 Nginx 转发的动态请求。
(1)安装 LAMP 相关服务
bash
运行
[root@apache ~]# dnf install -y httpd php php-mysqlnd mysql mysql-server
[root@apache ~]# systemctl start httpd mysqld
[root@apache ~]# systemctl enable httpd mysqld
(2)配置 MySQL 数据库
重置 root 密码,创建测试数据库、用户并插入测试数据:
bash
运行
[root@apache ~]# mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Kgc@123456';
mysql> CREATE DATABASE test_db DEFAULT CHARACTER SET utf8mb4;
mysql> CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'Test@123';
mysql> GRANT ALL ON test_db.* TO 'test_user'@'localhost';
mysql> FLUSH PRIVILEGES;
# 创建测试表并插入数据
mysql> USE test_db;
mysql> CREATE TABLE goods (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), price DECIMAL(10,2));
mysql> INSERT INTO goods (name, price) VALUES ('手机', 2999.00), ('电脑', 5999.00), ('平板', 1999.00);
mysql> exit
3. 编写 PHP 动态测试页面
在 Apache 网站根目录创建 PHP 测试文件,实现数据库查询并嵌入 Nginx 端的静态图片:
bash
运行
[root@apache ~]# vim /var/www/html/goods.php
<?php
// 连接MySQL数据库
$servername = "127.0.0.1";
$username = "test_user";
$password = "Test@123";
$dbname = "test_db";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("数据库连接失败: " . $conn->connect_error);
}
// 查询商品数据
$sql = "SELECT id, name, price FROM goods";
$result = $conn->query($sql);
// 输出查询结果
if ($result->num_rows > 0) {
echo "<h2>商品列表</h2>";
echo "<table border='1' cellpadding='8' cellspacing='0'>";
echo "<tr><th>ID</th><th>商品名称</th><th>价格</th></tr>";
while($row = $result->fetch_assoc()) {
echo "<tr><td>".$row["id"]."</td><td>".$row["name"]."</td><td>".$row["price"]."</td></tr>";
}
echo "</table>";
} else {
echo "暂无商品数据";
}
$conn->close();
// 嵌入Nginx端的静态图片(由Nginx直接解析)
echo "<br><img src='images/logo.png' alt='测试logo' width='200'>";
?>
4. 验证 LNAMP 动静分离效果
通过浏览器访问Nginx 服务器 IP 的测试页面:http://192.168.20.100/goods.php,可观察到以下效果:
- 页面显示商品列表数据:由 Apache 服务器解析 PHP 脚本,从 MySQL 数据库查询后返回,属于动态资源;
- 页面显示测试 logo 图片:由 Nginx 服务器直接读取本地静态文件并返回,属于静态资源;
- 查看 Apache 日志:
/var/log/httpd/access_log,可看到动态 PHP 请求的访问记录,无静态资源请求记录; - 查看 Nginx 日志:
/var/log/nginx/access.log,可看到静态图片的访问记录,无 PHP 动态请求记录。
以上现象说明 LNAMP 架构的动静分离配置成功,静态资源和动态资源实现了独立处理。
总结
本章节通过实操完成了 LNMP 架构的完整部署与 PHPWind 论坛的落地,同时实现了 LNAMP 架构的动静分离配置,核心知识点总结如下:
- LNMP 架构以 Nginx 为核心 Web 服务器,结合 PHP-FPM 处理动态请求,MySQL 存储数据,轻量级高并发的特点适用于中小规模 Web 应用;
- LNAMP 架构通过 Nginx 反向代理实现动静分离,静态资源由 Nginx 本地快速处理,动态请求转发至 Apache 解析,兼顾了高并发与兼容性,适用于中大型复杂 Web 业务;
- 服务优化的核心要点:Nginx 启用静态资源缓存、PHP-FPM 根据服务器内存调整进程数、数据库创建专用应用用户提升安全性;
- 架构协同的关键:Nginx 正确配置 PHP 解析规则或反向代理规则,PHP 开启对应的 MySQL 扩展,保证各服务之间的网络互通和权限匹配。
通过本章节的学习,能够掌握两种主流 Web 架构的部署与优化方法,根据实际业务场景选择合适的技术方案,同时具备排查架构中服务连接、解析、转发等常见问题的能力。