一.LNMP 架构核心组成
LNMP 是指Linux 操作系统下,Nginx (Web 服务器)、MySQL/MariaDB (数据库)、PHP(脚本语言)的组合架构,是搭建动态网站的主流方案之一,各组件核心作用如下:
表格
| 组件 | 核心定位 | 关键作用 |
|---|---|---|
| Linux | 底层操作系统 | 提供稳定的服务器运行环境,管理硬件资源 |
| Nginx | Web 服务器 / 反向代理 | 处理 HTTP 请求、反向代理、负载均衡、静态资源加速 |
| MySQL/MariaDB | 关系型数据库 | 存储网站数据(用户信息、文章内容等),支持数据增删改查 |
| PHP | 脚本语言 | 处理动态业务逻辑,连接 Web 服务器与数据库,生成动态页面 |
二.架构工作流程
- 用户通过浏览器发起 HTTP/HTTPS 请求,访问目标域名
- 请求首先到达Nginx 服务器,Nginx 根据请求规则判断:
- 若为静态资源(HTML、CSS、JS、图片等),直接由 Nginx 本地读取并返回
- 若为动态请求(如 PHP 接口、动态页面),Nginx 将请求转发给 PHP-FPM(PHP FastCGI 进程管理器)
- PHP-FPM 接收请求后,调用 PHP 解释器执行 PHP 脚本,脚本通过 MySQL 接口读取或写入数据库数据
- 执行结果经 PHP 处理后,返回给 Nginx,再由 Nginx 返回给用户,完成一次请求响应
三.在LNMP平台中部署Web应用
一.编译安装Nginx
(1)安装支持软件
Nginx 的配置及运行需要 pcre、zlib 等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保 Nginx 的安装顺利完成。

(2)创建运行用户,组和日志目录

(3)编译安装Nginx
[root@localhost ~]# tar zxf nginx-1.26.3.tar.gz
[root@localhost ~]# cd nginx-1.26.3
[root@localhost 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
[root@localhost nginx-1.26.3]# make && make install
--prefix=/usr/local/nginx:指定 Nginx 安装的根目录为 /usr/local/nginx
--user=nginx 和 --group=nginx:指定运行 Nginx 进程的用户和用户组为 nginx
--with-http_ssl_module:启用 HTTP SSL 模块,使 Nginx 支持 HTTPS
--with-http_v2_module:启用 HTTP/2 模块,支持 HTTP/2 协议
--with-http_realip_module:启用 realip 模块,用于从请求头中获取真实客户端 IP
--with-http_stub_status_module:启用 stub_status 模块,用于查看 Nginx 的状态信息
--with-http_gzip_static_module:启用 gzip 静态压缩模块,支持预压缩的静态文件发送
--with-pcre:启用 PCRE 库支持,用于正则表达式处理
--with-stream:启用 stream 模块,支持四层代理(如 TCP 代理)
为主程序nginx创建链接文件

(4)添加Nginx系统服务
bash
[root@localhost ~]# 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
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx
2.安装mysql 服务
由于源码编译速度问题,本章节实验采用dnf部署方式安装mysql服务

3.安装php-fpm服务
PHP-FPM(PHP FastCGI Process Manager)是 PHP 的 FastCGI 进程管理器,专为高并发场景设计,用于高效处理 PHP 脚本请求。它通过管理 PHP 进程池,显著提升 PHP 应用的性能和稳定性,是 Nginx 等 Web 服务器处理 PHP 请求的核心组件。本章节采用源码方式安装 php-fpm
(1)依赖环境安装

(2)编译安装php
bash
[root@localhost ~]# tar xzf php-8.2.20.tar.gz
[root@localhost ~]# cd php-8.2.20
[root@localhost 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-fpm \
--enable-opcache
[root@localhost php-8.2.20]# make -j$(nproc) && make install
修改php-fpm.conf配置文件

(3)编写php-fpm启动脚本

输入脚本内容

(4)php-fpm参数优化
Nginx 的 PHP 解析功能实现方法如果是交由 FPM 处理的,为了提高 PHP 的处理速度,可对 FPM 模块进行参数的调整。
FPM 进程有两种启动方式,由 pm 参数指定,分别是 static 和 dynamic,前者将产生固定数量的 fpm 进程,后者将以动态的方式产生 fpm 进程。
Static 的方式可以使用 pm.max_children 指定启动的进程数量。Dynamic 方式的参数要根据服务器的内存与服务负载进行调整。
Dynamic 方式的参数
| 选项 | 描述 |
|---|---|
pm.max_children |
指定启动最大的进程数量 |
pm.start_servers |
动态方式下初始的 fpm 进程数量 |
pm.min_spare_servers |
动态方式下最小的 fpm 空闲进程数 |
pm.max_spare_servers |
动态方式下最大的空闲进程数 |
假设:现有云服务器,运行了个人论坛,内存为 1.5G,fpm 进程数为 20,内存消耗近 1G,处理比较慢,对参数进行优化处理
[root@localhost ~]# vim /usr/local/php/etc/php-fpm.d/www.conf
pm=dynamic
pm.max_children=20
pm.start_servers=5
pm.min_spare_servers=2
pm.max_spare_servers=8
FPM启动时有五个进程,最小空闲两个进程,最大空闲八个进程,最多可以有二十个进程存在
4.测试LNMP协同工作
编写一个 ".php" 格式的网页测试文件,使用 PHP 内建的 "phpinfo ()" 函数显示服务器的 PHP 环境信息,PHP 代码应包括在 "" 标记之间。将测试网页文件放置到网站根目录下
[root@localhost ~]# vim /usr/local/nginx/html/index.php
<?php phpinfo(); ?>
配置 Nginx 支持 PHP 解析
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
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;
include fastcgi.conf;
}
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
浏览器测试访问index.php

测试PHP网页能否访问MySql数据库,编译index.php输入以下内容

浏览器测试访问index.php

部署discuz论坛
将下载的 Discuz 源码文件解压,找到其中的 upload 文件夹并将其放置到 LNMP 服务器的网站根目录,然后适当调整权限(若此处不调整,也可以参考安装页面的提示再调整),以允许 Nginx、php-fpm 程序拥有必要的写入权限。
[root@localhost ~]# mkdir -p /usr/local/nginx/html/bbs
[root@localhost ~]# unzip Discuz-X3.5-SC-UTF8-v20231001.zip
[root@localhost ~]# cp -ra upload/* /usr/local/nginx/html/bbs/
更改配置文件
[root@localhost ~]# cd /usr/local/nginx/html/bbs/config/
[root@localhost ~]# cp config_global_default.php config_global.php
[root@localhost ~]# cp config_ucenter_default.php config_ucenter.php
[root@localhost ~]# chown php:php /usr/local/nginx/html/bbs/ -R
更改 php.ini 防止连接数据库出错,添加如下配置
[root@localhost ~]# vim /usr/local/php/lib/php.ini
mysqli.default_socket = /var/lib/mysql/mysql.sock
pdo_mysql.default_socket = /var/lib/mysql/mysql.sock
[root@localhost ~]# systemctl restart php-fpm
创建数据库
[root@localhost ~]#mysql -uroot -p
mysql> CREATE USER 'discuz_user'@'localhost' IDENTIFIED BY 'pwd123';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT ALL PRIVILEGES ON discuz_db.* TO 'discuz_user'@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> ALTER USER 'discuz_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd123';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE DATABASE discuz_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0.01 sec)
mysql> exit
Bye
(3)安装web应用
访问地址http://192.168.10.101/bbs/install




