# Linux运维Day02:LNMP架构部署、动静分离原理、Nginx地址重写、systemd服务管理

一、LNMP架构概述

LNMP是目前主流的企业网站部署平台,由四大核心组件构成,各司其职协同工作:

  • L(Linux):操作系统,提供底层运行环境
  • N(Nginx):网站服务软件,处理静态资源、反向代理、负载均衡
  • M(MySQL/MariaDB):关系型数据库,存储网站业务数据
  • P(PHP/Python):网站开发语言,实现动态业务逻辑处理

二、LNMP环境完整部署(实操代码+步骤)

2.1 编译安装Nginx(1.22.1版本)

2.1.1 准备工作

nginx-1.22.1.tar.gz源码包上传至虚拟机web1/root目录,执行以下命令:

bash 复制代码
# 安装编译依赖包
[root@web1 ~]# dnf -y install gcc pcre-devel openssl-devel make
# 创建nginx运行用户(无登录权限)
[root@web1 ~]# useradd nginx
# 解压源码包
[root@web1 ~]# tar -xf /root/nginx-1.22.1.tar.gz
# 进入源码目录
[root@web1 ~]# cd nginx-1.22.1
2.1.2 编译配置+安装
bash 复制代码
# 初始化编译参数
[root@web1 nginx-1.22.1]# ./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_ssl_module
# 编译并安装
[root@web1 nginx-1.22.1]# make && make install
# 验证安装(目录存在即成功)
[root@web1 nginx-1.22.1]# ls /usr/local/nginx

2.2 安装MariaDB数据库

  • mariadb-devel:是mariadb服务的扩展依赖包
bash 复制代码
# 安装数据库服务端+客户端
[root@web1 ~]# dnf -y install mariadb-server mariadb
# 安装数据库扩展依赖包
[root@web1 ~]# dnf -y install mariadb-devel

2.3 安装PHP环境(含FPM+数据库扩展)

  • 安装php、php-fpm、php-mysqlnd
    • php:php语言的解释器,用于在服务器执行php代码
    • php-fpm:php进程的管理程序,负责接收Nginx转发的php请求
    • php-mysqlnd:php连接数据库的扩展功能包,使php可以连接数据库
bash 复制代码
# 安装PHP相关组件
[root@web1 ~]# dnf -y install php php-fpm php-mysqlnd
# 验证安装
[root@web1 ~]# rpm -q php php-fpm php-mysqlnd

2.4 启动服务并设置开机自启

  • nginx端口号:80
  • mariadb端口号:3306
  • php-fpm端口号:9000(需要手动配置,后续配置)
bash 复制代码
# 启动Nginx
[root@web1 ~]# /usr/local/nginx/sbin/nginx
# 启动MariaDB并设置开机自启
[root@web1 ~]# systemctl enable mariadb --now

# 验证Nginx端口
[root@web1 ~]# ss -nutlp | grep :80
# 验证MariaDB端口
[root@web1 ~]# ss -nutlp | grep :3306

三、Nginx+FastCGI:动静分离核心原理与配置

3.1 FastCGI工作原理

  • FastCGI是Nginx服务和PHP通信的标准协议,需要安装php-fpm 软件才能支持
  • Nginx本身不能解析 PHP 代码,只处理静态资源
  • 遇到 PHP 动态请求时,Nginx通过FastCGI 协议把请求转发给 php-fpm
  • php-fpm负责管理php进程池,将请求调度至空闲的php进程执行php脚本(一个fpm可以拥有多个php进程,每个进程都可以处理用户请求);
  • php脚本在运行的时候连接MariaDB/MySQL数据库(如需)完成数据增删改查;
  • 处理完的结果php-fpm原路通过FastCGI协议返回给 Nginx,再由 Nginx 返回给浏览器。
  • 此流程图也是Nginx动静分离的工作原理图
  • 静态页面:写死内容,不用后端处理,不用编译,不用执行,浏览器直接渲染显示
  • 动态页面:是由编程语言实现的,核心是后端实时运算、查数据库、拼接内容,是代码的运行结果
  • 真实生产环境中都是动静结合的

nginx本身只支持静态页面,但可以联动php

动静分离:让Nginx专注于处理静态页面,动态的请求交给后端的其他服务处理,从而提升站点的性能

3.2 FastCGI简介及优缺点

FastCGI简介

  • FastCGI是Nginx服务和php-fpm通信的标准协议
  • 基于 FastCGI 协议,几乎所有主流编程语言都可以实现对应的处理程序,如 PHP、Python、Perl、Java、C/C++、Ruby 等。
优点
  • 基于标准协议,支持PHP、Python、Java等多种主流语言;
  • 可以实现Nginx动静分离,提升网站访问效率。
缺点(了解)
  • 内存消耗大
    • 采用多进程模型处理请求,每个 PHP 进程都是独立运行的,会占用固定的内存资源。
    • 通常,单个 PHP 解释器进程的内存占用在 7MB ~ 25MB 之间;
    • 高并发场景下,如果进程池配置了 50~100 个 PHP 进程,总内存占用会非常可观。
  • 典型场景示例(Nginx + PHP-FPM 架构):
    • 10 个 Nginx 进程,每个约占 15MB 内存,总消耗约:10 × 15MB = 150MB
    • 64 个 PHP-FPM 进程,每个约占 20MB 内存,总消耗约:64 × 20MB = 1280MB
    • 在3万并发连接的压力下,需要更多的常驻进程,这种内存占用是架构本身的特性决定的。

3.3 配置PHP-FPM监听9000端口

  • php-fpm的配置文件可以定义两种连接方式

    • 基于网络协议栈的通信方式:Nginx和php-fpm通过9000端口进行数据交换
    • 基于本地文件的进程间通信方式:Nginx和php-fpm 通过 /run/php-fpm/www.sock 文件进行数据交换(就是将请求写入此文件,fpm通过读取文件实现通讯,这种方法不适合跨主机)
  • php-fpm配置文件路径为: vim /etc/php-fpm.d/www.conf

PHP-FPM默认监听本地sock文件,需修改为9000端口监听并重启服务:

bash 复制代码
[root@web1 ~]# vim /etc/php-fpm.d/www.conf          #修改php-fpm配置文件
...此处省略1万字,注释第37行,并在37行下方增加如下内容...

;listen = /run/php-fpm/www.sock                     #把第37行前方加上;注释
listen=127.0.0.1:9000  #本机127.0.0.1监听9000端口。这里的意思是动态请求转给哪台主机的9000端口,因为nginx和fpm在同一主机,所以写本机监听9000
#如果是跨主机,就要使用能和别的主机通讯的本机ip

...此处省略1万字...
[root@web1 ~]# systemctl restart php-fpm            #重新启动服务
[root@web1 ~]# ss  -nutlp  | grep   :9000           #查看9000端口

3.4 修改Nginx配置支持PHP动态请求

  • 修改nginx配置文件,是Nginx支持php动态请求
  • 将/usr/local/nginx/conf/nginx.conf的第66行-72行去掉注释,并配置

~ .php$ 是正则表达式,用于匹配php页面

bash 复制代码
[root@web1 ~]# vim /usr/local/nginx/conf/nginx.conf  #修改nginx配置文件
...此处省略1万字,下方为第66行-72行代码...
 location ~ \.php$ {                        #此处判断是不是php页面。如果用户访问的URL包含.php结尾
            root           html;
            fastcgi_pass   127.0.0.1:9000;  #动态请求转发给本地的9000端口即php-fpm服务
            fastcgi_index  index.php;
         #  fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  #注释此行
            include        fastcgi.conf;  #调用配置,加载FastCGI参数文件,一定是.conf文件
        } 
...此处省略1万字...
[root@web1 ~]# /usr/local/nginx/sbin/nginx -s reload  #重新加载配置文件
[root@web1 ~]# ss -nutlp  | grep :80                  #查看nginx端口号,正常

流程解析:

当访问的地址栏包含.php,那么就在配置的根目录:http寻找,没找到就会报错。如果找到了,交给php-fpm(就是127.0.0.1:9000的进程),通过php-fpm中的php进程进行编译,然后将结果返回给php-fpm,php-fpm返回给nginx,nginx返回给用户

location就是如果的意思,/ 匹配了你的访问地址,代表此虚拟主机的IP地址或者域名。

location / {} 的意思是如果你访问我的ip,我就从{}里的配置给你寻找

所以location语句的作用是匹配用户访问的地址

因此location ~ .php$ { } 意思就是匹配以.php结尾的页面。

而当同一个server同时包含 location ~ .php$ { } (动态配置)和 location \ { }

(静态配置),那么会优先匹配 location ~ .php$ { }

如果将nginx和php-fpm分别做到两台主机(也就是动,静分离到两个主机),应该这样配置:

机器 A(Nginx 所在机器)的 /usr/local/nginx/conf/nginx.conffastcgi_pass 192.168.8.100:9000;

机器 B(php-fpm 所在机器:192.168.8.100)的 /etc/php-fpm.d/www.conflisten=192.168.8.100:9000

3.5 LNMP环境测试

3.5.1 测试PHP解析
bash 复制代码
[root@web1 ~]# vim /usr/local/nginx/html/test.php    #编写php测试页面
<?php
$i=33;
echo $i;
?>
[root@web1 ~]# curl 192.168.8.100/test.php           #本机访问测试,可以看到33
3.5.2 测试PHP连接MariaDB
  • 编写php测试页面,将测试mysql.php测试脚本上传至虚拟机的/root
  • 将测试页面拷贝至/usr/local/nginx/html目录
bash 复制代码
# 上传mysql.php测试脚本到/root,拷贝至Nginx网页目录
[root@web1 ~]# cp /root/mysql.php /usr/local/nginx/html/
# 查看测试文件
[root@web1 ~]# cat /usr/local/nginx/html/mysql.php
# 本机访问测试
[root@web1 ~]# curl 192.168.8.100/mysql.php
# 浏览器访问:http://192.168.8.100/mysql.php,显示数据库信息即连接成功

四、Nginx高级技术:地址重写(rewrite)

4.1 地址重写概述

  • 获得一个来访的URL请求,然后改写成服务器可以处理的另一个URL的过程
  • 地址重写的好处
    • 缩短URL,隐藏实际路径,提高安全性
    • 易于用户记忆和键入
    • 易于被搜索引擎搜录
  • rewrite基本语法
    • rewrite regex replacement [flag]
    • rewrite 旧地址 新地址 [标记]

4.2 3.4 rewrite标记语法补充

  • rewrite 旧地址 新地址 [标记]
    • last:停止执行其他重写规则,重新匹配 location
    • break:停止执行其他的重写规则,完成本次请求
    • redirect:302 临时重定向,地址栏改变,爬虫不更新 URI
    • permanent:301 永久重定向,地址栏改变,爬虫更新 URI

4.3 实战案例1:单页面跳转(a.html→b.html)

4.3.1 基础跳转(模糊匹配)
  • 当用户访问:192.168.8.100/a.html --跳转至--> 192.168.8.100/b.html
  • 使用Windows访问测试,查看效果
bash 复制代码
# 创建测试页面
[root@web1 ~]# echo AAA > /usr/local/nginx/html/a.html
[root@web1 ~]# echo BBB > /usr/local/nginx/html/b.html

# 配置基础跳转
[root@web1 ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
    root   html;
    index  index.html index.htm;
    rewrite /a.html  /b.html;
}

# 重载配置
[root@web1 ~]# /usr/local/nginx/sbin/nginx -s reload
# 测试跳转
[root@web1 ~]# curl 192.168.8.100/a.html
# 输出BBB,但a.htmlabc也会跳转(匹配不严谨)
4.3.2 正则精准匹配
  • 目前访问192.168.8.100/a.htmlabc也会跳转192.168.8.100/b.html
  • 目前对于URL的匹配是包含关键字a.html即可跳转,这样不严谨
  • 可以使用正则表达式优化配置
bash 复制代码
# 修改配置(精准匹配a.html)
[root@web1 ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
    root   html;
    index  index.html index.htm;
    rewrite ^/a\.html$  /b.html;
}

# 重载配置
[root@web1 ~]# /usr/local/nginx/sbin/nginx -s reload
# 测试
[root@web1 ~]# curl 192.168.8.100/a.html      # 跳转成功
[root@web1 ~]# curl 192.168.8.100/a.htmlabc   # 不跳转
4.3.3 浏览器地址栏同步跳转(redirect)
  • 目前Windows浏览器访问192.168.8.100/a.html页面内容可以跳转
  • 但是URL中的地址不会跳转,可以增加redirect标记重定向
  • Windows浏览器重新访问,查看URL地址栏会跟随跳转
bash 复制代码
# 配置临时重定向
[root@web1 ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
    root   html;
    index  index.html index.htm;
    rewrite ^/a\.html$  /b.html    redirect;
}

# 重载配置
[root@web1 ~]# /usr/local/nginx/sbin/nginx -s reload
# 浏览器访问:http://192.168.8.100/a.html,地址栏自动变为b.html

4.4 实战案例2:跨站跳转

4.4.1 全站跳转(192.168.8.100→www.jxsedu.com
  • 不同网站间的跳转:192.168.8.100 --跳转至-->www.jxsedu.com
  • Windows浏览器访问测试
bash 复制代码
# 配置全站跳转
[root@web1 ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
    root   html;
    index  index.html index.htm;
    rewrite /   https://www.jxssedu.com;
}

# 重载配置
[root@web1 ~]# /usr/local/nginx/sbin/nginx -s reload
4.4.2 子页面同步跳转(带路径)
bash 复制代码
# 配置子页面跳转
[root@web1 ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
    root   html;
    index  index.html index.htm;
    rewrite /(.*)   https://www.jxssedu.com/$1;
}

# 重载配置
[root@web1 ~]# /usr/local/nginx/sbin/nginx -s reload
# 访问192.168.8.100/single/cloud,跳转至对应子页面

五、systemd管理Nginx服务(编写unit文件)

5.1 systemd Unit文件概述

  • systemd使用systemcl管理服务会读取对应的文件,此文件就是服务的unit文件
  • 读取文件的目录(由高到低)
  1. /etc/systemd/system:(设置了开机自启的Unit文件)
  2. /usr/lib/systemd/system:(所有已安装软件的Unit文件)
5.1.14.1 Unit语法格式

5.2 编写nginx.service文件

  • 交代环境背景,可使用AI生成nginx.service文件,适当微调
  • 配置中不要出现中文
bash 复制代码
# 创建Nginx服务unit文件
[root@web1 ~]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The Nginx HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID

[Install]
WantedBy=multi-user.target

5.3 生效配置并管理服务

bash 复制代码
# 停止原有Nginx进程
[root@web1 ~]# /usr/local/nginx/sbin/nginx -s stop
# 重载systemd配置
[root@web1 ~]# systemctl daemon-reload
# 启动Nginx
[root@web1 ~]# systemctl start nginx
# 设置开机自启
[root@web1 ~]# systemctl enable nginx
# 验证端口
[root@web1 ~]# ss -nutlp | grep :80
相关推荐
Shadow(⊙o⊙)1 小时前
Linux进程地址空间——钻入Linux内核架构性剖析 硬核手搓!
java·linux·运维·服务器·开发语言·c++
大明者省1 小时前
乌邦托服务器系统www不同文件夹bird、infra建立隔离的虚拟环境
linux·运维·服务器
Soari1 小时前
Harness Engineering:深度拆解 Anthropic 官方“长周期智能体(Long-Running Agents)”高效驾驭架构
架构·harness
MXsoft6181 小时前
**降本增效两不误:精细化运维助力业务持续增长**
运维
kobe_OKOK_1 小时前
ubuntu server设置 NTP 服务器
linux·服务器·ubuntu
团象科技1 小时前
跨境业务运维压力攀升,云原生运维补齐 AI 出海底层支撑短板
运维·人工智能·云原生
zzzsde1 小时前
【Linux】信号处理(3)信号处理&&valatile关键字
linux·运维·服务器·开发语言·算法
志栋智能1 小时前
超自动化运维:提升业务连续性的关键引擎
运维·服务器·网络·人工智能·自动化
AI科技星1 小时前
数理原本·卷零:信息本源与震动论
人工智能·线性代数·架构·概率论·学习方法·量子计算