LNMP网站架构与部署

一.LNMP 架构核心组成

LNMP 是指Linux 操作系统下,Nginx (Web 服务器)、MySQL/MariaDB (数据库)、PHP(脚本语言)的组合架构,是搭建动态网站的主流方案之一,各组件核心作用如下:

表格

组件 核心定位 关键作用
Linux 底层操作系统 提供稳定的服务器运行环境,管理硬件资源
Nginx Web 服务器 / 反向代理 处理 HTTP 请求、反向代理、负载均衡、静态资源加速
MySQL/MariaDB 关系型数据库 存储网站数据(用户信息、文章内容等),支持数据增删改查
PHP 脚本语言 处理动态业务逻辑,连接 Web 服务器与数据库,生成动态页面

二.架构工作流程

  1. 用户通过浏览器发起 HTTP/HTTPS 请求,访问目标域名
  2. 请求首先到达Nginx 服务器,Nginx 根据请求规则判断:
    • 若为静态资源(HTML、CSS、JS、图片等),直接由 Nginx 本地读取并返回
    • 若为动态请求(如 PHP 接口、动态页面),Nginx 将请求转发给 PHP-FPM(PHP FastCGI 进程管理器)
  3. PHP-FPM 接收请求后,调用 PHP 解释器执行 PHP 脚本,脚本通过 MySQL 接口读取或写入数据库数据
  4. 执行结果经 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 参数指定,分别是 staticdynamic,前者将产生固定数量的 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

相关推荐
枕布响丸辣2 小时前
LNMP 网站架构与部署全攻略:从零基础到上线运行
架构
闫良呀3 小时前
领域驱动设计 DDD(Domain-Driven Design)软件架构学习笔记
架构·代码规范
毛骗导演3 小时前
万字解析 OpenClaw 源码架构-跨平台应用之MacOS 应用
前端·架构
-Da-3 小时前
【操作系统学习日记】《现代处理器性能的三重奏:ISA架构、流水线与缓存系统》
后端·缓存·架构·系统架构
GISer_Jing5 小时前
OpenClaw架构深度解析:无新技术却爆火的底层逻辑
人工智能·ai·架构·aigc
搜佛说6 小时前
第2章-EdgeX-Foundry架构深度解析
数据库·物联网·架构·边缘计算·iot
无心水6 小时前
【常见错误】1、Java并发工具类四大坑:从ThreadLocal到ConcurrentHashMap,你踩过几个?
java·开发语言·后端·架构·threadlocal·concurrent·java并发四大坑
lauo6 小时前
dtnsbot分身网页版正式上线:开启“灵魂与肉身分离”的智能体远程控制新纪元
人工智能·智能手机·架构·开源·github
c++之路6 小时前
Linux进程池与线程池深度解析:设计原理+实战实现(网盘项目架构)
java·linux·架构