前言
在互联网技术高速发展的当下,Web 应用的性能、稳定性和扩展性成为企业级开发与运维的核心诉求。LNMP(Linux+Nginx+MySQL/MariaDB+PHP/Python)与 LNAMP(Linux+Nginx+Apache+MySQL/MariaDB+PHP/Python)架构凭借开源免费、高性能、高灵活性 的特性,成为企业级 Web 应用部署的主流选择。其中 LNMP 以轻量级、高并发处理能力见长,适合静态资源多、高访问量的场景;LNAMP 则结合了 Nginx 的高并发优势与 Apache 的成熟兼容性,通过动静分离技术进一步提升 Web 应用的处理效率,适用于中大型电商、社交平台、复杂 API 服务等业务场景。
本文将从实战角度出发,详细讲解 LNMP 架构的完整部署流程,包括 Nginx、MySQL、PHP-FPM 的编译安装与配置优化,以及开源论坛 Discuz 的部署;同时深入解析 LNAMP 架构的核心 ------ 动静分离实现,通过 Nginx 反向代理结合 Apache 处理动态请求,完成从环境搭建到功能验证的全流程操作,帮助运维工程师和技术从业者掌握两种架构的部署与优化技巧,具备解决生产环境常见问题的实战能力。
一、LNMP 架构完整部署实战
LNMP 架构是由 Linux 操作系统为基础,Nginx 作为 Web 服务器,MySQL/MariaDB 作为关系型数据库,PHP 作为后端脚本语言的轻量级 Web 架构,各组件各司其职且协同工作:Nginx 负责接收客户端请求、处理静态资源;PHP-FPM 作为 PHP 的 FastCGI 进程管理器,高效处理 PHP 动态脚本请求;MySQL 负责存储业务数据。本次实战将基于 Linux 系统,完成 LNMP 环境搭建并部署 Discuz! 开源社区论坛,所有操作均以root用户执行。
1.1 编译安装 Nginx
Nginx 是一款高性能的 HTTP 和反向代理服务器,支持高并发、低内存消耗,本次选择Nginx 1.26.3版本进行编译安装,编译安装可灵活配置模块,满足个性化业务需求。
1.1.1 安装 Nginx 依赖软件包
Nginx 的配置与运行依赖 pcre(正则表达式支持)、zlib(压缩支持)、openssl(HTTPS 支持)等开发包,需预先通过 dnf 安装:
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
gcc/make:编译工具,用于编译 Nginx 源码;pcre-devel/zlib-devel/openssl-devel:对应依赖的开发包,提供库和头文件;wget/tar:用于下载和解压源码包。
1.1.2 创建 Nginx 运行用户、组及日志目录
为保证 Nginx 运行的安全性,需创建专用的无登录权限用户,同时创建日志目录并赋予对应权限:
# 创建无家目录、无登录权限的nginx用户和组
useradd -M -s /sbin/nologin nginx
# 创建Nginx日志目录
mkdir -p /var/log/nginx
# 赋予nginx用户/组对日志目录的所有权
chown -R nginx:nginx /var/log/nginx
-M:不创建用户家目录;-s /sbin/nologin:禁止用户登录系统。
1.1.3 编译并安装 Nginx
-
下载并解压 Nginx 1.26.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
各参数说明:
表格
| 配置参数 | 功能说明 |
|---|---|
| --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 模块,获取客户端真实 IP |
| --with-http_stub_status_module | 启用状态模块,查看 Nginx 运行状态 |
| --with-http_gzip_static_module | 启用静态 gzip 压缩,优化静态资源传输 |
| --with-pcre | 启用 PCRE 库,支持正则表达式 |
| --with-stream | 启用四层代理模块,支持 TCP/UDP 代理 |
-
编译并安装 Nginx:
编译,-j$(nproc)利用所有CPU核心加速编译
make -j$(nproc) && make install
-
创建 Nginx 主程序软链接,方便全局调用:
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
1.1.4 添加 Nginx 系统服务
为方便通过systemctl管理 Nginx 的启动、停止、重启,需创建系统服务文件/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
配置完成后,重新加载系统服务并设置 Nginx 开机自启、立即启动:
# 重新加载systemd配置
systemctl daemon-reload
# 启动Nginx
systemctl start nginx
# 设置开机自启
systemctl enable nginx
可通过systemctl status nginx查看 Nginx 运行状态,显示active (running)即为启动成功。
1.2 安装并配置 MySQL 服务
MySQL 是开源的关系型数据库,为 Web 应用提供数据存储服务。考虑到源码编译速度较慢,本次采用dnf 包管理器快速安装 MySQL,版本为系统默认兼容版本。
1.2.1 安装 MySQL 服务
# 安装mysql客户端和服务端
dnf install mysql mysql-server -y
# 启动mysqld服务
systemctl start mysqld
# 设置开机自启
systemctl enable mysqld
1.2.2 重置 MySQL root 用户密码
MySQL 安装后默认 root 用户无密码,为保证数据库安全,需立即重置密码并刷新权限:
# 登录MySQL,默认密码为空,直接回车即可
mysql -uroot -p
# 重置root用户密码为Aptech1!(生产环境建议使用复杂密码)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Aptech1!';
# 刷新权限,使配置生效
FLUSH PRIVILEGES;
# 退出MySQL
exit
1.3 编译安装并优化 PHP-FPM
PHP 是动态脚本语言,Discuz 论坛基于 PHP 开发,而 Nginx 本身不支持解析 PHP 脚本,需通过PHP-FPM(PHP FastCGI Process Manager) 实现 PHP 脚本的解析。PHP-FPM 专为高并发场景设计,通过管理 PHP 进程池提升动态请求的处理效率,本次选择PHP 8.2.20版本源码编译安装。
1.3.1 安装 PHP 编译依赖环境
PHP 编译依赖众多开发包,需一次性安装完成,避免编译过程中出现依赖缺失错误:
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
1.3.2 编译并安装 PHP
-
下载并解压 PHP 8.2.20 源码包:
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 -
配置编译参数,开启 MySQL、GD 库、FPM 等核心模块:
./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
核心参数说明:
--prefix=/usr/local/php:指定 PHP 安装根目录;--with-mysqli=mysqlnd/--with-pdo-mysql=mysqlnd:启用 MySQL 原生驱动,提升 PHP 与 MySQL 的交互效率;--enable-gd/--with-freetype/--with-jpeg:启用 GD 库,支持图片处理;--enable-mbstring:启用多字节字符串支持,适配中文等多语言;--enable-opcache:启用 OPcache 缓存,提升 PHP 脚本执行速度;--enable-fpm:启用 FPM 模块,用于处理 Nginx 的 PHP 请求。
-
编译并安装 PHP:
make -j$(nproc) && make install
1.3.3 配置 PHP 核心配置文件php.ini
PHP 的核心配置文件为php.ini,需从源码包中复制模板文件并进行基础优化:
# 复制开发环境模板为正式php.ini(生产环境可使用php.ini-production)
cp php.ini-development /usr/local/php/lib/php.ini
# 设置时区为上海,解决PHP时间戳错误问题
sed -i 's/;date.timezone=/date.timezone = Asia\/Shanghai/' /usr/local/php/lib/php.ini
# 调整PHP内存限制,从128M提升至256M,满足Discuz运行需求
sed -i 's/memory_limit = 128M/memory_limit = 256M/' /usr/local/php/lib/php.ini
1.3.4 配置 PHP-FPM 配置文件
-
重命名 FPM 默认配置文件,启用配置:
重命名主配置文件
mv /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
重命名进程池配置文件(www为默认进程池)
mv /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
-
创建 PHP-FPM 专用运行用户,并修改进程池配置:
创建无登录权限的php用户
useradd -M -s /sbin/nologin php
编辑进程池配置,修改运行用户/组
vim /usr/local/php/etc/php-fpm.d/www.conf
将配置文件中的user = nobody和group = nobody修改为:
user = php
group = php
1.3.5 创建 PHP-FPM 系统服务
创建/etc/systemd/system/php-fpm.service服务文件,方便通过systemctl管理:
[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
User=php
Group=php
[Install]
WantedBy=multi-user.target
配置完成后,启动 PHP-FPM 并设置开机自启:
systemctl daemon-reload
systemctl start php-fpm
systemctl enable php-fpm
可通过netstat -tlnp | grep 9000查看 PHP-FPM 端口状态,默认监听 9000 端口,显示监听即为启动成功。
1.3.6 PHP-FPM 进程池参数优化
PHP-FPM 的进程管理由pm参数控制,分为static(固定进程数)和dynamic(动态进程数)两种模式,dynamic 模式可根据服务器负载动态调整进程数,更适合云服务器等资源有限的场景。
本次基于1.5G 内存的云服务器进行优化,该服务器运行 Discuz 论坛时,FPM 进程数 20 消耗内存近 1G,处理速度较慢,优化步骤如下:
# 编辑进程池配置文件
vim /usr/local/php/etc/php-fpm.d/www.conf
修改核心参数为:
# 启用动态进程模式
pm = dynamic
# 最大进程数,根据内存调整,1.5G内存设置为20
pm.max_children = 20
# 启动时的初始进程数
pm.start_servers = 5
# 最大空闲进程数,避免过多空闲进程占用内存
pm.max_spare_servers = 8
# 最小空闲进程数,保证突发请求的处理效率
pm.min_spare_servers = 2
优化后,FPM 启动时初始化 5 个进程,最小保持 2 个空闲进程,最大空闲 8 个进程,最多可创建 20 个进程,兼顾处理效率和内存占用。修改完成后重启 PHP-FPM 使配置生效:
systemctl restart php-fpm
1.4 测试 LNMP 各组件协同工作
LNMP 各组件安装配置完成后,需进行两步测试:PHP 环境解析测试 和PHP 与 MySQL 数据库连接测试,确保各组件能正常协同工作。
1.4.1 测试 PHP 环境解析
-
配置 Nginx 支持 PHP 解析,编辑 Nginx 主配置文件:
vim /usr/local/nginx/conf/nginx.conf
在server配置段中,修改location /并添加location ~ \.php$配置,实现 PHP 脚本解析:
server {
listen 80;
server_name localhost;
# 处理所有请求
location / {
root html;
# 设置默认索引页,添加index.php
index index.html index.htm index.php;
}
# 匹配.php结尾的请求,交给PHP-FPM处理
location ~ \.php$ {
root html;
# PHP-FPM默认监听9000端口
fastcgi_pass 127.0.0.1:9000;
# 设置PHP默认索引页
fastcgi_index index.php;
# 加载fastcgi配置文件,定义请求参数
include fastcgi.conf;
}
}
-
检查 Nginx 配置文件语法并重新加载配置:
语法检查,无报错则显示ok
nginx -t
重新加载配置
nginx -s reload
-
创建 PHP 测试文件,使用
phpinfo()函数查看 PHP 环境信息:vim /usr/local/nginx/html/index.php
写入以下内容:
<?php
// 输出PHP环境信息
phpinfo();
?>
- 浏览器访问测试:在客户端浏览器中输入
http://Nginx服务器IP/index.php,若能显示 PHP 8.2.20 的环境信息页面,说明 Nginx 能正常解析 PHP 脚本。
1.4.2 测试 PHP 与 MySQL 数据库连接
-
修改 PHP 测试文件,编写数据库连接代码:
vim /usr/local/nginx/html/index.php
替换为以下内容:
<?php
// 连接MySQL数据库,参数为:数据库地址、用户名、密码
$link=mysqli_connect('127.0.0.1','root','Aptech1!');
// 判断连接是否成功
if($link)
echo"恭喜你,数据库连接成功啦!!";
// 关闭数据库连接
mysqli_close($link);
?>
- 浏览器访问测试:重新访问
http://Nginx服务器IP/index.php,若页面显示恭喜你,数据库连接成功啦!!,说明 PHP 能正常与 MySQL 数据库建立连接,LNMP 各组件协同工作正常。
1.5 部署 Discuz! 开源社区论坛
Discuz! 是基于 PHP+MySQL 开发的开源社区论坛软件,功能全面、性能优异、安全稳定,是 LNMP 架构的典型应用场景。本次部署Discuz-X3.5版本,完成从源码部署到数据库配置再到网页安装的全流程。
1.5.1 准备 Discuz 源码并配置目录权限
-
下载 Discuz-X3.5 源码包(可从官方网站
www.discuz.net下载),解压并将核心文件复制到 Nginx 网站根目录,创建独立的论坛目录bbs:创建论坛目录
mkdir -p /usr/local/nginx/html/bbs
解压Discuz源码包(假设源码包为Discuz-X3.5-SC-UTF8-v20231001.zip)
unzip Discuz-X3.5-SC-UTF8-v20231001.zip
将upload目录下的所有文件复制到bbs目录
cp -ra upload/* /usr/local/nginx/html/bbs/
-
复制 Discuz 默认配置文件并赋予目录权限:
进入论坛配置目录
cd /usr/local/nginx/html/bbs/config/
复制默认全局配置和UCenter配置
cp config_global_default.php config_global.php
cp config_ucenter_default.php config_ucenter.php赋予php用户/组对论坛目录的所有权,保证PHP-FPM有写入权限
chown php:php /usr/local/nginx/html/bbs/ -R
-
配置 PHP 的 MySQL 套接字,防止数据库连接出错:
vim /usr/local/php/lib/php.ini
添加以下配置,指定 MySQL 套接字文件路径:
mysqli.default_socket = /var/lib/mysql/mysql.sock
pdo_mysql.default_socket = /var/lib/mysql/mysql.sock
添加完成后重启 PHP-FPM:
systemctl restart php-fpm
1.5.2 为 Discuz 创建专用数据库和用户
为降低 Web 应用对数据库的安全风险,不建议直接使用 MySQL root 用户连接 Discuz,需创建专用的数据库、数据库用户,并赋予仅对该数据库的操作权限。
-
登录 MySQL 数据库:
mysql -uroot -p
-
创建 Discuz 专用数据库
discuz_db,指定字符集为utf8mb4(适配中文、emoji 等字符):CREATE DATABASE discuz_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
创建数据库用户
discuz_user,设置密码为pwd123(生产环境建议使用复杂密码):CREATE USER 'discuz_user'@'localhost' IDENTIFIED BY 'pwd123';
-
赋予
discuz_user对discuz_db数据库的所有操作权限:GRANT ALL PRIVILEGES ON discuz_db.* TO 'discuz_user'@'localhost';
-
调整用户认证方式,刷新权限:
适配MySQL8.0+认证方式,避免连接失败
ALTER USER 'discuz_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd123';
刷新权限,使配置生效
FLUSH PRIVILEGES;
退出MySQL
exit
1.5.3 网页端完成 Discuz 安装
-
客户端浏览器访问 Discuz 安装地址:
http://Nginx服务器IP/bbs/install,进入 Discuz 安装向导页面。 -
安装步骤:
- 环境检测:安装向导会自动检测 LNMP 环境是否满足 Discuz 运行要求,若有未通过项,根据提示修复(如目录权限、PHP 扩展等);
- 选择安装方式 :选择全新安装 Discuz!X(独立模式安装),点击下一步;
- 数据库配置 :输入数据库信息 ------ 数据库地址
127.0.0.1、数据库名discuz_db、用户名discuz_user、密码pwd123,表前缀保持默认pre_,点击下一步; - 创建管理员:设置论坛管理员账号、密码、邮箱,这是论坛的最高权限账号,需妥善保存;
- 完成安装 :等待安装程序执行数据库初始化和文件配置,安装完成后会提示 "站点安装完成",可选择进入管理后台 或直接访问站点。
-
安装完成后,删除 Discuz 的安装目录
install,保证论坛安全:rm -rf /usr/local/nginx/html/bbs/install/
至此,基于 LNMP 架构的 Discuz 论坛部署完成,可通过http://Nginx服务器IP/bbs访问论坛,进行板块创建、用户管理等操作。
二、LNAMP 架构部署与动静分离实现
LNAMP 架构是在 LNMP 基础上引入 Apache 服务器,形成Nginx+Apache 的双层 Web 服务器架构,核心思想是动静分离 :Nginx 凭借高并发、低内存的优势,负责处理静态资源请求 (如图片、CSS、JS、HTML 等);Apache 凭借成熟的兼容性、丰富的模块支持,负责处理动态资源请求 (如 PHP 脚本)。Nginx 通过反向代理将动态请求转发给 Apache,实现静态与动态请求的分离处理,大幅提升 Web 应用的整体处理效率和稳定性。
本次 LNAMP 实战采用两台 Linux 主机搭建,分别部署 Nginx 和 Apache 服务,实现动静分离,服务器配置与服务规划如下:
表格
| 服务器 | 操作系统 | 配置 | 核心服务 | 功能 | 服务器 IP |
|---|---|---|---|---|---|
| 服务器 1 | Linux | 2C4G | Nginx | 反向代理、处理静态资源 | 192.168.10.101 |
| 服务器 2 | Linux | 2C4G | Apache+PHP+MySQL | 处理动态资源、存储数据 | 192.168.10.102 |
2.1 服务器 1(192.168.10.101):Nginx 反向代理配置
服务器 1 作为 LNAMP 架构的前端,需安装 Nginx 并配置反向代理规则,实现静态资源本地处理 、动态 PHP 请求转发至 Apache 服务器,同时开启静态资源缓存,提升访问速度。
2.1.1 安装并初始化 Nginx
本次采用 dnf 包管理器快速安装 Nginx,无需编译,满足基础反向代理需求:
# 关闭防火墙,避免端口拦截(生产环境建议开放80端口即可)
systemctl stop firewalld && systemctl disable firewalld
# 安装Nginx
dnf -y install nginx
# 进入Nginx配置目录,备份默认配置文件
cd /etc/nginx/
cp nginx.conf.default nginx.conf
2.1.2 配置 Nginx 反向代理与动静分离
编辑 Nginx 主配置文件nginx.conf,修改server配置段,添加静态资源匹配规则和动态请求转发规则:
vim /etc/nginx/nginx.conf
核心配置如下:
server {
listen 80;
server_name localhost;
# 静态资源根目录
root /usr/share/nginx/html;
# 默认索引页
index index.html index.php;
# 处理静态资源:匹配jpg、jpeg、png、gif、css、js等静态文件
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
# 开启静态资源缓存,缓存有效期7天,降低重复请求
expires 7d;
}
# 处理动态资源:匹配.php结尾的请求,转发至Apache服务器
location ~ \.php$ {
# 核心指令:将动态请求转发到Apache服务器IP(192.168.10.102)的80端口
proxy_pass http://192.168.10.102:80;
# 传递请求头:保证Apache获取正确的Host信息
proxy_set_header Host $host;
# 传递客户端真实IP给Apache,方便日志统计
proxy_set_header X-Real-IP $remote_addr;
# 传递代理IP链,多代理场景下保留真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
配置说明:
location ~* \.(jpg|jpeg|png|gif|css|js)$:使用~*表示不区分大小写匹配静态资源后缀,expires 7d设置浏览器缓存 7 天,减少 Nginx 的重复请求处理;proxy_pass:Nginx 反向代理核心指令,将匹配的 PHP 请求转发至后端 Apache 服务器;proxy_set_header:设置请求头,解决后端 Apache 获取不到客户端真实 IP、Host 信息的问题。
配置完成后,检查 Nginx 语法并启动 Nginx:
nginx -t
systemctl start nginx && systemctl enable nginx
2.1.3 创建 Nginx 静态资源目录并上传测试文件
创建静态资源目录(如 images),并上传测试图片kgc.png,用于后续动静分离效果验证:
# 创建静态图片目录
mkdir -p /usr/share/nginx/html/images
# 上传测试图片(可通过rz、wget等方式,此处假设已存在kgc.png)
cp kgc.png /usr/share/nginx/html/images/
2.2 服务器 2(192.168.10.102):搭建 LAMP 环境
服务器 2 作为 LNAMP 架构的后端,需搭建LAMP(Linux+Apache+MySQL+PHP) 环境,负责处理 Nginx 转发的 PHP 动态请求,同时存储业务数据。本次采用 dnf 包管理器快速搭建,高效便捷。
2.2.1 安装 LAMP 核心组件
一次性安装 Apache、PHP、MySQL 及 PHP-MySQL 驱动,保证各组件兼容:
dnf install httpd php php-mysqlnd mysql mysql-server -y
httpd:Apache 服务器主程序;php-mysqlnd:PHP 与 MySQL 交互的原生驱动;- 其余组件与 LNMP 架构中功能一致。
2.2.2 启动 LAMP 各服务并设置开机自启
# 启动Apache
systemctl start httpd && systemctl enable httpd
# 启动MySQL
systemctl start mysqld && systemctl enable mysqld
2.2.3 重置 MySQL root 用户密码
与 LNMP 架构一致,MySQL 安装后默认无密码,需重置密码:
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Aptech1!';
FLUSH PRIVILEGES;
exit
2.3 服务器 2(192.168.10.102):配置动态测试环境
为验证动静分离效果,需在 Apache 服务器上创建PHP 动态测试页面,实现 MySQL 数据查询,并嵌入由 Nginx 处理的静态图片,同时创建测试数据库和数据表,提供数据支撑。
2.3.1 创建测试数据库和用户
创建测试数据库testdb、测试用户testuser,并创建users数据表,插入测试数据:
-
登录 MySQL:
mysql -uroot -p
-
执行以下 SQL 语句:
创建测试数据库
CREATE DATABASE testdb;
创建测试用户,允许本地访问,密码为Test@123
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;
创建用户表,包含id(自增主键)和name(用户名)
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR (50));
插入三条测试数据
INSERT INTO users (name) VALUES('张三'),('李四'),('王五');
退出MySQL
exit
2.3.2 编写 PHP 动态测试页面
Apache 的默认网站根目录为/var/www/html,在该目录下创建test.php,实现MySQL 数据查询 和静态图片嵌入:
vim /var/www/html/test.php
写入以下内容:
<?php
// 数据库连接信息
$servername = "127.0.0.1";
$username = "testuser";
$password = "Test@123";
$dbname = "testdb";
// 创建MySQL数据库连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接是否成功
if ($conn->connect_error) {
die("数据库连接失败: " . $conn->connect_error);
}
// 编写查询SQL,查询users表所有数据
$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服务器的静态资源目录
// 此处src直接写images/kgc.png,由Nginx转发处理
echo "<img src='images/kgc.png' alt='测试图片'>";
?>
代码说明:
- 实现 MySQL 数据库的连接与数据查询,输出用户列表(动态内容);
- 嵌入
<img>标签,图片地址为images/kgc.png,该请求会被 Nginx 拦截并处理(静态内容)。
2.4 验证 LNAMP 动静分离效果
动静分离的核心验证点为:客户端访问 Nginx 服务器的 PHP 页面,动态内容由 Apache 处理,静态内容由 Nginx 直接返回,具体验证步骤如下:
- 客户端浏览器访问地址:
http://192.168.10.101/test.php(Nginx 服务器 IP); - 页面显示效果:
- 上方显示用户列表 ,包含 ID 和姓名(张三、李四、王五),该内容由 Apache 从 MySQL 数据库中查询并返回,属于动态内容;
- 下方显示嵌入的测试图片
kgc.png,该图片由 Nginx 从本地静态资源目录中读取并返回,属于静态内容;
- 日志验证:
- 查看 Apache 的访问日志
/var/log/httpd/access_log,可看到 Nginx 转发的 PHP 请求记录,包含客户端真实 IP; - 查看 Nginx 的访问日志
/var/log/nginx/access.log,可看到静态图片kgc.png的请求记录,无 PHP 请求记录。
- 查看 Apache 的访问日志
若以上效果均实现,说明 LNAMP 架构的动静分离配置成功,Nginx 和 Apache 各司其职,协同工作正常。
三、LNMP 与 LNAMP 架构对比及场景选择
LNMP 和 LNAMP 架构均基于 Linux 开源生态,核心组件高度重合,仅在 Web 服务器层存在差异,两种架构各有优劣,适用于不同的业务场景,运维人员需根据业务规模、访问量、资源配置、兼容性需求灵活选择。
3.1 架构核心差异
表格
| 对比维度 | LNMP 架构 | LNAMP 架构 |
|---|---|---|
| Web 服务器 | 单 Nginx | Nginx+Apache 双层架构 |
| 核心原理 | Nginx+PHP-FPM 直接处理动静请求 | 动静分离,Nginx 处理静态、Apache 处理动态 |
| 资源占用 | 轻量级,内存 / CPU 消耗低 | 略高,需同时运行 Nginx 和 Apache |
| 并发处理能力 | 高,适合高并发场景 | 中高,静态请求由 Nginx 扛高并发,动态请求由 Apache 处理 |
| 兼容性 | 一般,Nginx 对部分老旧 PHP 框架 / 模块支持有限 | 优秀,Apache 兼容所有 PHP 框架 / 模块,成熟稳定 |
| 配置复杂度 | 低,单服务器配置,组件少 | 中,双服务器(或单服务器多服务)配置,需配置反向代理 |
3.2 适用业务场景
3.2.1 LNMP 架构适用场景
- 中小型 Web 应用:如个人博客、小型企业官网、轻量级 API 服务,资源配置有限(1C2G/2C4G),追求轻量级、高性价比;
- 高并发静态资源多的场景:如资讯类网站、图片站、下载站,静态资源(HTML、图片、JS)占比超过 80%,Nginx 的高并发优势能充分发挥;
- 现代化 PHP 框架开发的应用:如 Laravel、ThinkPHP6 + 等,对 PHP-FPM 支持良好,无老旧模块依赖。
3.2.2 LNAMP 架构适用场景
- 中大型 Web 应用:如电商平台、社交论坛、政企官网,业务逻辑复杂,访问量较大,对稳定性和兼容性要求高;
- 老旧 PHP 项目迁移:部分传统 PHP 项目基于 Apache 开发,依赖 Apache 的特有模块(如 mod_rewrite、mod_php),直接迁移到 Nginx 会出现兼容性问题,LNAMP 架构可无缝兼容;
- 动静资源占比均衡的场景:动态请求(PHP、数据库交互)占比 40%-60%,需要 Apache 的成熟兼容性处理动态请求,同时利用 Nginx 的高并发处理静态请求。
3.3 架构扩展建议
- LNMP 架构扩展 :当业务访问量提升时,可采用Nginx 集群 + PHP-FPM 集群 + MySQL 主从复制的方式扩展,通过负载均衡器分发请求,提升整体处理能力;
- LNAMP 架构扩展 :可将 Nginx 升级为Nginx 集群 ,Apache 升级为Apache 集群,配合 MySQL 分库分表,支撑超大规模 Web 应用的访问需求;
- 通用优化建议 :无论哪种架构,均需开启缓存机制 (Nginx 静态缓存、PHP OPcache、MySQL 查询缓存)、压缩机制(Nginx gzip 压缩),并对服务器进行内核优化(如调整文件句柄数、TCP 连接参数),进一步提升性能。
四、总结
本文从实战角度出发,完成了LNMP 架构的完整部署 和LNAMP 架构的动静分离实现,核心知识点总结如下:
- LNMP 架构部署的核心是 Nginx、MySQL、PHP-FPM 的编译安装与配置优化,重点掌握 PHP-FPM 进程池参数调整和 Nginx 的 PHP 解析配置,实现各组件的协同工作,并成功部署 Discuz 开源论坛,完成从环境搭建到业务应用的落地;
- LNAMP 架构的核心是动静分离 和反向代理,通过两台服务器分别部署 Nginx 和 Apache,实现静态资源由 Nginx 本地处理、动态 PHP 请求由 Nginx 转发至 Apache 处理,充分发挥 Nginx 的高并发优势和 Apache 的兼容性优势;
- 掌握了 Nginx 反向代理的核心配置(
proxy_pass、proxy_set_header),以及静态资源缓存(expires)的配置技巧,解决了后端服务器获取客户端真实 IP 的问题; - 明确了 LNMP 和 LNAMP 架构的核心差异与适用场景,运维人员可根据业务需求灵活选择,同时掌握了两种架构的基础扩展思路,为后续处理生产环境的高并发、高可用需求奠定基础。
LNMP 和 LNAMP 架构作为企业级 Web 应用部署的主流方案,其核心思想是组件解耦、各司其职 ,通过合理的配置与优化,能在开源生态下实现高性能、高稳定的 Web 服务。在实际生产环境中,还需结合监控(Zabbix/Prometheus)、日志(ELK)、容器化(Docker/K8s) 等技术,构建完整的 Web 应用运维体系,进一步提升架构的可观测性和可扩展性。