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

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.101Nginx前端反向代理、处理静态资源
192.168.10.102Apache+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 服务的稳定性和响应速度。

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

http://www.jsqmd.com/news/477374/

相关文章:

  • 计算机毕业设计springboot计算机原理仿真实验平台 基于Spring Boot的计算机组成原理虚拟实验教学系统设计与实现 Spring Boot框架下的数字逻辑与体系结构在线实验平台构建
  • 2026防脱生发加盟新机遇:头皮健康产业创业指南 - 品牌排行榜
  • 最近在折腾一套老当益壮的物流管理系统,看到SQL2008和VS2010的配置差点劝退。不过跑起来之后发现这玩意儿功能全得离谱,今天带大家扒一扒它的代码骨架
  • linux awk使用
  • 2026年江浙鲁皖地区靠谱国际高中推荐,林国荣学校课程及优势解读 - mypinpai
  • Linux 网络操作系统常用命令手册
  • 一文看懂大润发购物卡回收平台选择技巧:快速交易无烦恼! - 团团收购物卡回收
  • 唐潮门窗作为铝制构件厂家,多地服务口碑如何,费用贵不贵? - 工业品网
  • LangChain项目初始化:环境配置与依赖管理的最佳实践
  • FMC子卡设计方案:202-基于TI DSP TMS320C6678、Xilinx K7 FPGA XC7K325T的高速数据处理核心板
  • 从OpenClaw热潮看制造业AI Agent的架构落地实录
  • 进口岩板品牌研发能力哪家强,施恩德怎么样? - 工业推荐榜
  • 如何升高图纸标注气泡效率?几百个尺寸标注需要多长时间?
  • 推荐几家性价比高的淘金船源头厂家 - 工业设备
  • 自媒体变现必看:朱雀过不了,再努力也白搭
  • 盘点2026年干式变压器零售商排名,适合配电室应用的有哪些 - myqiye
  • 教务系统查看平时分
  • 地球上的硅的储量够造多少倍于现在的芯片
  • 10kv单芯电缆故障定位系统 电缆在线监测系统厂家沃伦森(WARENSEN)
  • AI编程(二):Trae+MCP+figma 应用开发
  • 宋大美妞鸡柳烧饼作为推荐的美食小吃加盟公司,在江苏加盟如何选择? - mypinpai
  • 做私域千万别碰这6件事,轻则限流,重则封号
  • 硬盘容量标注为什么在 Windows 中看到的容量往往比厂家标注的要“小”很多?
  • 交通照明选型核心逻辑:道路、隧道、路口照明的差异化需求解析
  • 白色情人节,予你无尽的爱
  • 算法设计与分析-习题2.3
  • 一文讲透|9个降AIGC平台测评:本科生降AI率必备指南
  • 2026中国停车场管理系统十大标杆供应商榜单——智赋停车,共筑城市出行新生态
  • Windows桌面审计:用OCR高效提取VHD磁盘内容
  • DBeaver Ultimate Edtion 26.0 Multilingual (macOS, Linux, Windows) - 通用数据库工具