LNMP 网站架构与部署实战手册

一、架构核心认知

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 步操作:

  1. 检查运行环境(自动通过,若有报错根据提示调整权限);
  2. 填写数据库信息(数据库名 discuz_db、用户名 discuz_user、密码 pwd123);
  3. 设置管理员账号和密码,完成安装。

四、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),页面将显示:

  1. 动态内容:从 192.168.10.102 的 MySQL 中查询的用户列表(Apache 处理);
  2. 静态内容:由 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 动静分离的优势

  1. 提升性能:Nginx 处理静态资源的效率远高于 Apache,单独处理可减少 Apache 压力;
  2. 易于扩展:静态资源可部署至 CDN,动态服务可横向扩容多台 Apache 服务器;
  3. 降低耦合:静态和动态资源分开部署,便于单独维护和升级。

5.4 数据库安全最佳实践

  1. 避免使用 root 用户操作业务数据库,创建专用低权限用户,仅授权对应数据库;
  2. 数据库密码设置复杂(字母 + 数字 + 特殊符号),定期更换;
  3. 禁止数据库直接暴露公网,仅允许应用服务器内网访问。

5.5 LNMP/LNAMP 架构故障排查要点

  1. Nginx :查看日志/var/log/nginx/error.log,检查配置语法nginx -t
  2. PHP-FPM :查看日志/usr/local/php/var/log/php-fpm.log,检查端口监听netstat -tulnp | grep 9000
  3. MySQL :查看日志/var/log/mysqld.log,检查端口监听netstat -tulnp | grep 3306
  4. Apache :查看日志/var/log/httpd/error_log,检查端口监听netstat -tulnp | grep 80

六、架构总结

  1. LNMP 架构轻量高效,适合小型网站、个人博客、高并发静态站点,部署简单,资源占用低;
  2. LNAMP 架构通过动静分离和反向代理,结合 Nginx 和 Apache 的优势,适合中大型企业级应用,兼顾性能与兼容性;
  3. 两种架构的核心是各组件各司其职,通过合理的配置和优化(如 PHP-FPM 进程、Nginx 缓存、数据库索引),可大幅提升 Web 服务的稳定性和响应速度。

部署时需根据业务规模、资源配置、访问量选择合适的架构,同时做好服务监控、日志收集和安全防护,保障生产环境的稳定运行。

相关推荐
飞Link3 小时前
深度拆解 Pepper 机器人开发架构与实战指南
架构·机器人
balmtv3 小时前
Gemini 3 flash架构深度拆解:从稀疏MoE到原生多模态的工程实现
架构
以后换名字3 小时前
delphi对接API的优势
微服务·架构·api·软件架构调整
balmtv3 小时前
GPT-5.4推理技术深度拆解:计算机使用、工具搜索与极限推理的架构实现
人工智能·gpt·架构
分享牛3 小时前
Operaton入门到精通20-Jakarta EE 11 时代的架构演进
架构
架构师沉默4 小时前
女孩去旅行,给男朋友带回了一个难解的 Bug
java·后端·架构
landuochong2004 小时前
SpecKit学习
人工智能·架构·claudecode
阿猿收手吧!5 小时前
【C++】高并发内存池架构与设计解析
开发语言·c++·架构
薛定猫AI5 小时前
【技术干货】Cloud Code vs Codex:架构对比、性能评估与实战混合方案
架构