LNMP架构拆分

6190 字
31 分钟
LNMP架构拆分

LNMP架构拆分#

[TOC]


业务背景#

image-20260208135045396
image-20260208135045396

  • 通过 负载均衡 ,让用户平均的访问我们两台web服务器

    Nginx 和 PHP 分别部署在两台web服务器上

  • 静态的数据 不能放在web本地磁盘,都得放在NFS上

  • 动态的数据 放在数据库上

  • 提交的任何信息都是 NFS数据库 来处理的

    我们的两台web服务器上,没有任何数据的落盘 也就是没有任何数据,需要写入到我们web本地磁盘上

微服务解耦合#

✅ 简单概括“微服务解耦合”:

  • 把一个 大系统 拆成多个 独立的小服务

  • 每个服务只负责一个功能,单独开发、部署、运行和扩展

  • 彼此之间通过接口通信,互不影响

🌟 再精炼一下:

“我不一次性给你所有功能,而是按需提供;每个功能独立放在自己的服务器上,各自维护、互不牵连”

💡 解耦合的核心好处:

  • 故障隔离:一个服务挂了,不影响其他服务
  • 灵活迭代:改一个功能,不用重新部署整个系统
  • 技术异构:不同服务可以用不同语言或框架
  • 独立扩展:哪个服务压力大,就单独给它加机器

虽然成本高(运维、网络、监控更复杂),但换来的是 更高的灵活性和可维护性

业务层解耦:

✅ 将不同的业务功能模块,抽象为独立的接口或服务

  • 就是一个接口,点过去,直接跳走了

💡 好处:修改一个业务模块不影响其他模块


服务层解耦:

✅每个 微服务 应独立部署、独立运行,避免把多个服务部署在同一物理或虚拟服务器上,防止“故障传播”和“资源争抢”

数据库拆分#

image-20260207162134102
image-20260207162134102

Terminal window
[root@web01 ~]#netstat -lntup
Active Internet connections (only servers)
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 956/php-fpm: master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1006/nginx: master
tcp6 0 0 :::3306 :::* LISTEN 1241/mysqld
# 现在php,nginx,mysql都在web01上面跑着
为什么要进行数据库的拆分???
由于单台服务器运行LNMP架构会导致网站访问缓慢,当内存被占满时,很容易导致系统出现oom(内存溢出),从而kill掉MySQL数据库,所以要将web和数据库进行独立部署
'Linux急了,自己杀自己!'
1)静态数据{做缓存处理(CDN)}
固定不变:一旦生成,内容不会随时间或操作改变(除非人为修改)
举个例子:像图片、视频、CSS、JavaScript 文件
# 上面的这些都是存放在磁盘中的,不能进行修改,只能进行删除!
2)动态数据{不能做缓存(部分)}
实时变化:内容会随时间、用户交互或系统状态不断更新
示例:个人主页、订单信息、购物车、银行卡余额、消息通知、股票价格.....
用户名、密码(属于敏感信息,通常绝不缓存)
点赞数、评论列表(可能频繁变化)
数据库拆分后解决了什么问题?
1.缓解web网站的压力
2.增强数据库读写性能
3.提高用户访问速度
'一个网站压力最大的部分,是哪个服务?'
# 数据库服务
1.用户注册、发评论、点赞、下单……这些操作最终都要写入数据库
2.多表联查、模糊匹配、聚合统计等操作会大量占用 CPU 和内存
3.高并发场景下,成千上万的请求同时读写同一张表
4.数据库不能像静态资源那样随意缓存或丢弃

创建db01#

Terminal window
'IP地址:10.0.0.51'
# 部署mariadb服务并启动
[root@db01 ~]#yum -y install mariadb-server
[root@db01 ~]#systemctl start mariadb
[root@db01 ~]#systemctl enable mariadb
# 启动起来之后,不需要修改密码,因为我们需要把原来的库(web01上的数据库)搬过来,原来的用户名和密码也搬过来!

导出&导入#

Terminal window
# 我们的web01上搭建过wordpress和wecenter,数据库中有它俩的admin账号和密码
[root@web01 ~]#mysqldump -uroot -poldboy123.com -A > all.sql
# -A备份所有数据库至all.sql中
#✅️如果只想导出某个库, 后面直接跟数据库就好了,不要-A选项!!!
[root@web01 ~]#ll
-rw-r--r-- 1 root root 3147221 Feb 8 14:43 all.sql
# 不指定路径就是存放在当前路径下了
[root@web01 ~]#scp all.sql root@172.16.1.51:~
# 将all.sql拷贝到51服务器的/root/路径下
root@172.16.1.51's password: '
all.sql 100% 3073KB 33.9MB/s 00:00
# 没有做免密,得输入密码
'切换到db01'
[root@db01 ~]#ll /root/
-rw-r--r-- 1 root root 3147221 Feb 8 14:47 all.sql
# 成功传过来了
[root@db01 ~]#mysql -uroot < all.sql
# 导入自己的数据库中
# db01并没创建密码,-p可以省略不写
[root@db01 ~]#systemctl restart mariadb
# 重启生效
[root@db01 ~]#mysql -uroot -poldboy123.com -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| wordpress |
| zh |
+--------------------+
# 查看数据库导入是否成功
# 里面直接就有了wordpress和wecenter的数据库了

修改数据库的指向#

Terminal window
'数据库中,有默认的保护措施,root账号只有本机可以连接!'
# 不允许root来进行远程连接,危险!
1)在数据库中要授权一个普通账号jiuzhao(名字随意),来进行远程连接
2)专库专管,对jiuzhao这个普通用户授权,可以管理wordpress和zh这两个库
3)停止web01数据库,并禁止开机自启动
4)修改业务指向为172.16.1.51
'web01测试和db01的连通性'
[root@web01 wordpress]#mysql -h 172.16.1.51 -uroot -poldboy123.com
ERROR 1045 (28000): Access denied for user 'root'@'web01' (using password: YES)
表示 MySQL 拒绝了来自远程主机 web01 的用户 'root' 的连接请求,尽管提供了密码
# -h 指定远程连接主机IP地址
# web01远程连接db01中的root账户
# 默认mysql禁止root远程连接
1&2'所以我们要来到db01中创建用户并授权'
[root@db01 ~]#mysql -uroot -poldboy123.com -e "grant all on *.* to 'jiuzhao'@'%' identified by 'oldboy123.com';"
# 授予所有权限 grant all
# 授予所有库所有表 *.*
# 'jiuzhao':用户名
# '%':表示允许任意IP地址连接
# 授权该用户的登录密码,identified by
[root@db01 ~]#mysql -uroot -poldboy123.com -e "flush privileges;"
# 刷新权限
[root@db01 ~]#mysql -ujiuzhao -poldboy123.com
Welcome to the MariaDB monitor.
MariaDB [(none)]>
# 本地测试,可以连接到数据库
'切换到web01'
# 远程测试web01执行:
[root@web01 wordpress]#mysql -h 172.16.1.51 -ujiuzhao -poldboy123.com
Welcome to the MariaDB monitor.
MariaDB [(none)]> quit # 退出
# 使用jiuzhao用户远程连接数据库测试
3.停止web01服务器上的mariadb
[root@web01 ~]#systemctl stop mariadb
[root@web01 ~]#systemctl disable mariadb
Removed /etc/systemd/system/multi-user.target.wants/mariadb.service.
Removed /etc/systemd/system/mysql.service.
Removed /etc/systemd/system/mysqld.service.
# 浏览器访问:wordpress
http://wp.kpyun.com/
'建立数据库连接时出错'
F12--->网络--->刷新页面--->看状态码500
# 5xx服务器端错误;4xx客户端错误;304缓存命中;
4.将配置文件中的数据库指向到51服务器
[root@web01 ~]#cd /code/wordpress/
# 先切换到代码目录中去
# 如何查找包含数据库信息的配置文件查呢???
[root@web01 wordpress]#grep -r 'oldboy123.com' ./*
./wp-config.php:define( 'DB_PASSWORD', 'oldboy123.com' );
# -r在当前目录中递归查找关键词
# 在当前文件中的wp-config.php配置文件中
[root@web01 wordpress]#vim wp-config.php
# 修改wordpress业务的配置文件
'这里修改的既不是nginx的配置文件,也不是php的配置文件,自然不用重启它俩'
[root@web01 wordpress]#grep '^define' wp-config.php
define( 'DB_NAME', 'wordpress' );
# 数据库名称不用变
define( 'DB_USER', 'jiuzhao' );
define( 'DB_PASSWORD', 'oldboy123.com' );
define( 'DB_HOST', '172.16.1.51' );
# 用户名、密码、主机;
# 测试访问http://wp.kpyun.com/
'业务恢复正常'
---------------------------------------
浏览器访问:
http://zh.kpyun.com/
# zh.kpyun.com 当前无法处理此请求,状态码500
# 修改wecenter配置文件的数据库指向
[root@web01 wordpress]#cd /code/zh/
[root@web01 zh]#grep -r 'oldboy123.com' ./
./system/config/database.php: 'password' => 'oldboy123.com',
[root@web01 zh]#vim ./system/config/database.php
......
'host' => '172.16.1.51',
# 修改为远程数据库主机IP
'username' => 'jiuzhao',
# 修改为远程用户
'password' => 'oldboy123.com',
'dbname' => 'zh',
'port' => '3306',
# 测试访问http://zh.kpyun.com/
'业务恢复正常'

Web服务器扩展#

image-20260207164323520
image-20260207164323520

Terminal window
为什么要扩展多台web节点???
单台web服务器能抗住的访问量是有限的,配置多台web服务器能提升更高的访问速度
扩展多台web解决了什么问题
1.单台web节点如果故障,会导致业务down机
2.多台web节点能保证业务的持续稳定,扩展性高
3.多台web节点能有效的提升用户访问网站的速度

创建web02#

Terminal window
'IP地址:10.0.0.8'
[root@web02 ~]#rpm -qa nginx php
# 什么都没有安装
#Nginx
1.配置nginx仓库
[root@web02 ~]#scp 10.0.0.7:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/
# 把web01上的Nginx仓库拉取到web02
'下面的scp的操作全部都是拉取远程主机上的文件'
root@10.0.0.7's password: '
# 后期可以做ssh免密登录
nginx.repo 100% 113 178.8KB/s 00:00
2.通过官网仓库安装nginx
[root@web02 ~]# yum -y install nginx
3.将web01上的server全拷贝到web02
[root@web02 ~]#scp 10.0.0.7:/etc/nginx/conf.d/* /etc/nginx/conf.d/
# 同步子配置文件
[root@web02 ~]#scp 10.0.0.7:/etc/nginx/nginx.conf /etc/nginx/
# 主配置文件,主要是我们修改了启动用户为www
[root@web02 ~]#head /etc/nginx/nginx.conf
user www;
#PHP
1.安装php服务
[root@web02 ~]# yum -y install php php-bcmath php-cli php-common php-devel php-embedded php-fpm php-gd php-intl php-mbstring php-mysqlnd php-opcache php-pdo php-process php-xml php-json
2.同步php配置文件
[root@web02 ~]#scp 10.0.0.7:/etc/php-fpm.d/www.conf /etc/php-fpm.d/
# 这个php配置文件主要用于配置web网站的
# 也修改的默认的启动用户为www
[root@web02 ~]#egrep '^user|^group' /etc/php-fpm.d/www.conf
user = www
group = www
3.创建www用户并测试启动服务
[root@web02 ~]# groupadd -g666 www
[root@web02 ~]# useradd -u666 -g666 -M -s /sbin/nologin www
[root@web02 ~]#id www
uid=666(www) gid=666(www) groups=666(www)
[root@web02 ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web02 ~]#php-fpm -t
[08-Feb-2026 17:22:47] NOTICE: configuration file /etc/php-fpm.conf test is successful
[root@web02 ~]#systemctl start nginx php-fpm
[root@web02 ~]#systemctl enable nginx php-fpm
4.查看是否启动成功 9000和80端口
[root@web02 ~]#netstat -lntup
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1687/php-fpm: maste
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1688/nginx: master
5.安装下载wordpress和wecenter
'不要用scp把web01下的/code全部都拷贝过来,这样会把静态资源也拷贝过来,比如照片'
[root@web02 ~]#mkdir /server/tmp
# 用来临时存放压缩包
[root@web02 ~]#cd /server/tmp/
[root@web02 tmp]#wget https://cn.wordpress.org/wordpress-6.0-zh_CN.tar.gz
[root@web02 tmp]#ll
total 46020
-rw-r--r-- 1 root root 25238972 Feb 8 17:30 'WeCenter V3.6.2.zip'
# ftp上传
-rw-r--r-- 1 root root 21881579 Jun 16 2022 wordpress-6.0-zh_CN.tar.gz
[root@web02 tmp]#mkdir -p /code/wordpress
[root@web02 tmp]#mkdir /code/zh
# 创建代码目录
[root@web02 tmp]#tar zxf wordpress-6.0-zh_CN.tar.gz -C /code/
[root@web02 tmp]#unzip 'WeCenter V3.6.2.zip' -d /code/zh
6.验证并修改属主
[root@web02 tmp]#ll /code/wordpress/
total 212
-rw-r--r-- 1 1006 1006 405 Feb 6 2020 index.php
-rw-r--r-- 1 1006 1006 19915 Jan 1 2022 license.txt
-rw-r--r-- 1 1006 1006 7401 Mar 23 2022 readme.html
-rw-r--r-- 1 1006 1006 7165 Jan 21 2021 wp-activate.php
drwxr-xr-x 9 1006 1006 4096 Jun 16 2022 wp-admin
......
'不要有多级目录/code/wordpress/wordpress'
[root@web02 tmp]#ll /code/zh
total 96
drwxr-xr-x 36 root root 4096 Jan 31 2022 app
drwxr-xr-x 2 root root 6 Jan 31 2022 cache
-rw-r--r-- 1 root root 24596 Jan 17 2022 changelog.txt
-rw-r--r-- 1 root root 297 Jan 5 2022 composer.json
-rw-r--r-- 1 root root 29989 Oct 18 2021 composer.lock
-rw-r--r-- 1 root root 705 Dec 17 2021 index.php
drwxr-xr-x 3 root root 33 Jan 31 2022 install
......
[root@web02 tmp]#ll /code/
drwxr-xr-x 5 1006 1006 4096 Jun 16 2022 wordpress
drwxr-xr-x 14 root root 4096 Feb 8 17:34 zh
'文件属主不对'
[root@web02 tmp]#chown -R www.www /code/wordpress/
[root@web02 tmp]#chown -R www.www /code/zh/
[root@web02 tmp]#ll /code
total 8
drwxr-xr-x 5 www www 4096 Jun 16 2022 wordpress
drwxr-xr-x 14 www www 4096 Feb 8 17:34 zh
[root@web02 tmp]#scp 10.0.0.7:/code/wordpress/wp-config.php /code/wordpress/
wp-config.php 100% 3318 3.6MB/s 00:00
[root@web02 tmp]#scp 10.0.0.7:/code/zh/system/config/database.php /code/zh/system/config/
database.php 100% 339 439.1KB/s 00:00
7.hosts解析
# 将windows hosts解析到web02
10.0.0.8 wp.kpyun.com zh.kpyun.com
# 更换IP地址即可,不让它映射到web01,只映射到web02
浏览器访问:
http://wp.kpyun.com/
http://zh.kpyun.com/

image-20260208180303198
image-20260208180303198

image-20260208180552899
image-20260208180552899

静态资源实现一致性#

Terminal window
Windows中hosts映射为web02
10.0.0.8 www.wp.com
# 并上传一张图片

image-20260208193945864
image-20260208193945864

  • 右键图片---->在新标签页中打开图像

image-20260208195234869
image-20260208195234869

Terminal window
'http://wp.kpyun.com/wp-content/uploads/2026/02/'
[root@web02 ~]#ll /code/wordpress/wp-content/uploads/2026/02/
# / == /code/wordpress
-rw-r--r-- 1 root root 107263 Feb 8 20:13 头像-1024x1024.jpg
-rw-r--r-- 1 root root 5678 Feb 8 20:13 头像-150x150.jpg
-rw-r--r-- 1 root root 16160 Feb 8 20:13 头像-300x300.jpg
-rw-r--r-- 1 root root 69590 Feb 8 20:13 头像-768x768.jpg
'它这里是对我们上传的图片,生成多个尺寸的缩略图,所以才有那么多份图片'
-rw-r--r-- 1 www www 112362 Feb 8 19:38 头像.jpg
Windows中的hosts再次解析为10.0.0.7(web01)
# 验证查看,是否能够找到这张图片(静态资源)

image-20260208194721146
image-20260208194721146


image-20260208192646969
image-20260208192646969

❤️关键点​

  1. web02上传一张图片,它存储web02的磁盘中,web01无法访问

  2. 要找到wordpres存储 静态资源的路径

    两台web服务器的 静态资源 都要存储在NFS服务器中

Terminal window
拆分静态资源至独立服务器
# 增加一台NFS服务器(10.0.0.31),实现共享存储
为什么拆分静态资源至独立存储服务器???
当后端的web节点出现多台时,会导致用户上传的图片、视频附件等内容仅上传至一台web服务器,那么其他的web服务器则无法访问到该图片
新增一台nfs存储解决了什么问题???
1.保证了多台web节点静态资源一致
2.有效节省多台web节点的存储空间
3.统一管理静态资源,便于后期推送至CDN进行静态资源加速

部署NFS服务#

Terminal window
10.0.0.31服务器
1.安装nfs
yum -y install nfs-utils
2.配置nfs
[root@nfs ~]#vim /etc/exports
/data/wp 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zh 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
# 这里指定了压缩用用为www
3.创建必要数据
[root@nfs ~]#groupadd -g666 www
[root@nfs ~]#useradd -u666 -g666 -M -s/sbin/nologin www
[root@nfs ~]#id www
uid=666(www) gid=666(www) groups=666(www)
[root@nfs ~]#rm -rf /data/*
[root@nfs ~]#mkdir -p /data/wp
[root@nfs ~]#mkdir -p /data/zh
[root@nfs ~]#ll /data/
total 0
drwxr-xr-x 2 root root 6 Feb 8 20:06 wp
drwxr-xr-x 2 root root 6 Feb 8 20:06 zh
[root@nfs ~]#chown -R www.www /data/
[root@nfs ~]#ll /data/
total 0
drwxr-xr-x 2 www www 6 Feb 8 20:06 wp
drwxr-xr-x 2 www www 6 Feb 8 20:06 zh
4.启动nfs
[root@nfs ~]# systemctl restart nfs
# 修改完nfs的配置文件一定要重启服务!
[root@nfs ~]# systemctl enalble nfs
5.客户端测试
# 安装软件但是不启动
[root@web01 zh]#yum -y install nfs-utils
[root@web01 zh]#showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/zh 172.16.1.0/24
/data/wp 172.16.1.0/24
'切换为web02'
[root@web02 ~]#yum -y install nfs-utils
[root@web02 ~]#showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/zh 172.16.1.0/24
/data/wp 172.16.1.0/24
6.客户端挂载
'我们在挂载之前,必须得把原来的静态资源拷贝过去'
# 否则一旦挂载上之后,原来的静态资源会被隐藏掉!
1)拷贝web服务器中的静态资源到NFS的/data/wp
[root@web02 ~]#scp -r /code/wordpress/wp-content/uploads/* 10.0.0.31:/data/wp/
# 这里我只有web02有静态资源,web01并没有,所以没有拷贝web01的!
2)挂载NFS到web01和web02
[root@web02 ~]#mount -t nfs 172.16.1.31:/data/wp /code/wordpress/wp-content/uploads/
[root@web02 ~]#df -h
Filesystem Size Used Avail Use% Mounted on
172.16.1.31:/data/wp 49G 3.8G 46G 8% /code/wordpress/wp-content/uploads
# web02成功挂载
[root@web01 zh]#mount -t nfs 172.16.1.31:/data/wp /code/wordpress/wp-content/uploads/
mount.nfs: mount point /code/wordpress/wp-content/uploads/ does not exist
# 这里web01报错目录不存在,因为它没有什么静态资源,它还没有创建这个目录
[root@web01 zh]#mkdir -p /code/wordpress/wp-content/uploads/
# 我们可以进行手动创建
'这里是以root身份创建的,别忘记修改属主'
[root@web01 ~]#ll /code/wordpress/wp-content/
......
drwxr-xr-x 2 root root 6 Feb 8 20:17 uploads
[root@web01 ~]#chown www.www /code/wordpress/wp-content/uploads/
# 我只改了目录,没有-R递归修改
[root@web01 ~]#ll /code/wordpress/wp-content/
drwxr-xr-x 2 www www 6 Feb 8 20:17 uploads
[root@web01 ~]#mount -t nfs 172.16.1.31:/data/wp /code/wordpress/wp-content/uploads/
# 再次进行挂载
[root@web01 zh]#df -h
Filesystem Size Used Avail Use% Mounted on
172.16.1.31:/data/wp 49G 3.8G 46G 8% /code/wordpress/wp-content/uploads
[root@web01 zh]#tree /code/wordpress/wp-content/uploads/
/code/wordpress/wp-content/uploads/
└── 2026
└── 02
├── 头像-1024x1024.jpg
├── 头像-150x150.jpg
├── 头像-300x300.jpg
├── 头像-768x768.jpg
└── 头像.jpg
# web01也有了这些静态资源!
# 浏览器再次访问web01的wordpres
http://wp.kpyun.com

image-20260208203114569
image-20260208203114569

小坑#

image-20260209092149451
image-20260209092149451

Terminal window
为什么还是不对呢???
用户上传--->Nginx(www)--->php(www)--->nfs(www)
# 我们明明统一了用户了
[root@web02 ~]#ll /code
'web服务器上业务代码'
drwxr-xr-x 5 www www 4096 Feb 8 17:51 wordpress
drwxr-xr-x 14 www www 4096 Feb 8 17:34 zh
# 我们在扩展web服务器的时候,就已经改过属主了!
[root@nfs ~]#ll /data/
'nfs上的共享目录'
drwxr-xr-x 3 www www 18 Feb 8 20:13 wp
drwxr-xr-x 2 www www 6 Feb 8 20:06 zh
# 我们都修改了文件的属主,属组;可还是报错了!
# 我们最后一步是客户端进行挂载
# 挂载之前,先进行静态文件的拷贝(web02)
scp -r /code/wordpress/wp-content/uploads/* 10.0.0.31:/data/wp/
'我们是以root用户操作的,自然拷贝过去(nfs),也是以root身份存在的'
[root@nfs ~]#ll /data/wp/
drwxr-xr-x 3 root root 16 Feb 8 20:13 2026
[root@web02 ~]#ll /code/wordpress/wp-content/uploads/
drwxr-xr-x 3 root root 16 Feb 8 20:13 2026
# 它俩查看的是一个目录,属主都是root,别人(www)在这个目录只有r-w权限
# 所以www不能在这个目录下创建文件!
[root@nfs ~]#chown -R www.www /data/wp/
[root@nfs ~]#ll /data/wp/
total 0
drwxr-xr-x 3 www www 16 Feb 8 20:13 2026
# web01和web02和nfs操作的是一个目录,在哪台机器上改都一样!
# 浏览器再次进行测试上传
'上传成功'

image-20260209092000941
image-20260209092000941

代理#

正向代理#

  • 作用对象:代表客户端(用户)去访问外部资源

  • 典型场景:公司内网通过 代理服务器 访问互联网

image-20260209105019740
image-20260209105019740

反向代理#

  • 作用对象:代表 服务器 接收来自 客户端 的请求,再转发给后端真实服务器
  • 典型场景:Nginx 作为反向代理,实现 ==负载均衡==

image-20260209105926409
image-20260209105926409

增加负载均衡#

image-20260209102431059
image-20260209102431059

Terminal window
增加lb01(负载均衡服务器)
IP地址;10.0.0.5(公网);局域网(172.16.1.5)
用户访问-->负载均衡服务器10.0.0.5(公网)-->局域网(172.16.1.5)访问后面的服务器
1)我们公网IP地址只需要在负载均衡上配置就可以了!
2)后面的服务器全部配置局域网IP地址
# 不需要用公网,浪费,没有意义!
'用户只需要和负载均衡建立连接就可以了,由负载均衡代理着用户,请求后面的服务器'
负载均衡服务器默认按照请求,平均分担到后端服务器
平均分担:你一个它一个....
# 负载均衡是基于反向代理实现的!

粗略配置#

Terminal window
1.创建10.0.0.5 lb01
2.部署Nginx
[root@lb01 ~]#rpm -qa nginx
[root@lb01 ~]#scp 10.0.0.7:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/
# 把Nginx官方仓库传过来
root@10.0.0.7's password: '
nginx.repo 100% 113 195.0KB/s 00:00
[root@lb01 ~]#yum -y install nginx
[root@lb01 ~]#systemctl start nginx
[root@lb01 ~]#systemctl enable nginx
# 开启Nginx服务并开机自启动
负载均衡服务器本身通常不需要修改启动用户为 www
1)它只负责转发 HTTP 请求到后端 Web 服务器
2)它不运行 PHP/Python 等应用代码,也不直接访问后端 Web 应用的文件目录
3)因此,无需将其运行用户改为 www
Terminal window
1.配置nginx反向代理
[root@lb01 conf.d]#rm -rf default.conf
# 删除默认的配置
[root@lb01 conf.d]#vim lb.conf
server {
listen 80;
server_name lb01.com;
location / {
proxy_pass http://10.0.0.7;
}
}
[root@lb01 conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 conf.d]#systemctl reload nginx
2.web01准备静态页面
'切换web01服务器'
[root@web01 ~]#cd /etc/nginx/conf.d/
[root@web01 conf.d]#vim test.conf
server {
listen 80;
server_name test.kpyun.com;
location / {
root /code/test;
# 注意根目录
index index.html;
}
}
[root@web01 conf.d]#mkdir /code/test
[root@web01 conf.d]#echo web01_index > /code/test/index.html
3.检测启动
[root@web01 conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 conf.d]#systemctl reload nginx
4.web01本地测试
[root@web01 conf.d]#vim /etc/hosts
10.0.0.7 test.kpyun.com
10.0.0.7 php.kpyun.com
[root@web01 conf.d]#curl test.kpyun.com
web01_index
[root@web01 conf.d]#curl php.kpyun.com
<title>PHP 8.0.30 - phpinfo()</title>
[root@web01 conf.d]#curl 10.0.0.7
<title>PHP 8.0.30 - phpinfo()</title>
# 他俩访问的都是php的默认主页
[root@web01 conf.d]#ll
total 20
-rw-r--r-- 1 root root 316 Feb 6 21:20 php.conf
-rw-r--r-- 1 root root 136 Aug 29 17:40 php-fpm.conf
-rw-r--r-- 1 root root 119 Feb 9 12:00 test.conf
-rw-r--r-- 1 root root 325 Feb 6 19:21 wp.conf
-rw-r--r-- 1 root root 318 Feb 7 04:13 zh.conf
# 这几个子配置文件中,并没有配置去专门监听10.0.0.7这个地址
# 也没有设置“置空”的server
# 所以默认匹配第一个子配置文件,也就是php.conf这个配置文件
[root@web01 conf.d]#cat php.conf
server {
listen 80;
server_name php.kpyun.com;
root /code;
location / {
index index.php index.html;
}
.....
# 我们访问的就是这个主页!
[root@web01 conf.d]#cat /code/index.php
<?php
phpinfo();
?>
5.Windows浏览器测试
windows的hosts指向10.0.0.5
10.0.0.5 lb01.com
浏览器访问:
http://lb01.com/
用户访问lb01.com --> 10.0.0.7(跳转访问)
'proxy_pass http://10.0.0.7;'

image-20260209135331420
image-20260209135331420

image-20260209135603750
image-20260209135603750

Terminal window
# 我们再次修改负载均衡的配置配置文件
[root@lb01 conf.d]#vim /etc/hosts
10.0.0.7 test.kpyun.com
# lb01自己先做解析
[root@lb01 ~]#cd /etc/nginx/conf.d/
[root@lb01 conf.d]#vim lb.conf
server {
listen 80;
server_name lb01.com;
location / {
proxy_pass http://test.kpyun.com;
# 现在指向test.kpyun.com
}
}
[root@lb01 conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 conf.d]#systemctl reload nginx
浏览器访问:
http://lb01.com/
用户访问lb01.com --> test.kpyun.com(跳转访问)
'proxy_pass http://test.kpyun.com;'
# lb01自己得做hosts解析才能访问到它

image-20260209141554559
image-20260209141554559

优化配置#

image-20260209152515131
image-20260209152515131

image-20260209152917601
image-20260209152917601

Terminal window
1)这样的配置,只是把lb01当做跳板,去访问web01,繁琐且麻烦!
# 而且只能解析一个!那么web02不就被搁置了吗?
'proxy_set_header Host $http_host;'
保留用户请求的Host主机
2)用户访问10.0.0.5【lb01】(HTTP/1.1)--->10.0.0.7【web01】(HTTP/1.0)
# HTTP协议由1.1--->1.0
# 由长连接变为了短连接,这个才是最致命的!
'proxy_http_version 1.1;'
固定HTTP版本为1.1,长连接
3)后面web服务器上记录的都是lb01的IP地址而不是真实用户的IP地址
'proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;'
记录客户真实的IP地址
[root@web01 ~]#cat /var/log/nginx/access.log
10.0.0.5 - - [09/Feb/2026:15:16:49 +0800] "GET / HTTP/1.0".. "-"
# 没有配真实来源IP,后面是"-"
10.0.0.5 - - [09/Feb/2026:16:05:48 +0800] "GET /favicon.ico HTTP/1.1" "10.0.0.1"
# 只有前面有负载均衡,且配置了真实的来源IP,才会显示它!
Terminal window
1)修改子配置文件
[root@lb01 conf.d]#vim lb.conf
server {
listen 80;
server_name test.kpyun.com;
# 保留了用户请求的Host,这里直接写web服务的域名即可
location / {
proxy_pass http://10.0.0.7;
# 通过内网和后面web服务器建立连接
# 后面改为内网172.16.1.7;这里为了方便抓包改为10.0.0.0/24(VMnet8)
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
[root@lb01 conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 conf.d]#systemctl reload nginx
2)Windows中的hosts映射修改
10.0.0.5 test.kpyun.com
浏览器访问:http://test.kpyun.com/

image-20260209154827372
image-20260209154827372

image-20260209160754816
image-20260209160754816

image-20260209161115117
image-20260209161115117

最终优化#

Terminal window
1.超时控制参数
proxy_connect_timeout 30;
作用:定义 Nginx 与后端服务器建立 TCP 连接的最大时间
默认值:30 秒(超时后返回 504 Gateway Timeout)
使用场景:当后端服务器网络延迟高或负载过高时,可适当调大此值(如 60 秒)
proxy_send_timeout 60;
作用:定义 Nginx 向后端发送请求数据的超时时间
# 负载均衡--->后面web服务器
默认值:60 秒(超时后中断连接)
使用场景:客户端上传大文件或后端处理缓慢时,需增加此值
proxy_read_timeout 60;
作用:定义 Nginx 从后端读取响应数据的超时时间
# 后面web服务器--->负载均衡
默认值:60 秒(超时后中断连接)
使用场景:后端处理耗时较长(如复杂计算、长轮询)时需调高
'这三个参数都有默认值!'

image-20260209165255571
image-20260209165255571

Terminal window
2. 缓冲控制参数
# 负载均衡服务器是边收边传!收到用户一个请求,传给后面一个请求
# 而不是堆积,再一下子把所有请求给web
proxy_buffering on;
作用:启用代理响应缓冲(默认开启)
效果:Nginx 会先将后端返回的响应数据存入内存/磁盘缓冲区,再逐步发送给客户端
'是web返回的响应,而不是用户发的请求!'
优点:减轻后端服务器压力,优化客户端的传输效率
缺点:可能增加内存占用,有一定延时
# 用户在前几秒看到空白,然后突然刷出全部内容
proxy_buffer_size 32k;
作用:设置单个缓冲区的大小,用于存储后端响应的第一部分(如响应头)
值:32KB(默认通常为 4KB 8KB)
关键点:这部分数据会直接发送给客户端,需确保足够容纳响应头
proxy_buffers 4 128k;
作用:设置缓冲区的数量和大小,用于存储后端响应的内容体
值:4 个缓冲区 × 每个 128KB(总缓冲容量 = 4 × 128KB = 512KB)
调整依据:
1)响应内容较大(如文件下载)时,需增加缓冲区数量和大小
2)内存有限的服务器需谨慎设置,避免 OOM(内存溢出)
Terminal window
1)web02配置
[root@web02 ~]#scp 172.16.1.7:/etc/nginx/conf.d/test.conf /etc/nginx/conf.d/
root@172.16.1.7's password: '
test.conf 100% 132 231.1KB/s 00:00
[root@web02 ~]#ll /etc/nginx/conf.d/
-rw-r--r-- 1 root root 132 Feb 9 17:01 test.conf
'注意你scp拷贝过来,不指定用户,默认就是root'
[root@web02 ~]#mkdir /code/test
[root@web02 ~]#echo 'web02-index' > /code/test/index.html
# 创建默认页
'这些操作,也是以root的身份进行的'
[root@web02 ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web02 ~]#systemctl reload nginx
[root@web02 ~]#vim /etc/hosts
10.0.0.8 test.kpyun.com
# 修改web02的映射文件
[root@web02 ~]#curl test.kpyun.com
web02-index
# 成功访问
2)lb01配置(10.0.0.5)
[root@lb01 conf.d]#cat lb.conf
upstream webs {
server 172.16.1.7;
server 172.16.1.8;
}
# upstream 是 Nginx 用于定义一组后端服务器的指令
# webs 是这个服务器组的名称,也叫地址池;你可以自定义
'upstream 模块必须定义在 server 块的外部'
# ❌ 错误:upstream 不能放在 server 块内
server {
listen 80;
server_name test.kpyun.com;
location / {
proxy_pass http://webs;
# 表示将匹配到的请求反向代理到名为 webs 的 upstream 服务器组
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
}
}
[root@lb01 conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 conf.d]#systemctl reload nginx
[root@lb01 conf.d]#vim /etc/hosts
10.0.0.5 test.kpyun.com
[root@lb01 conf.d]#curl test.kpyun.com
web01_index
[root@lb01 conf.d]#curl test.kpyun.com
web02-index
'实现负载均衡'
upstream webs {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name test.kpyun.com;
location / {
proxy_pass http://webs;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
}
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

LNMP架构拆分
https://www.kpyun.fun/posts/web/nginx/nginx04/
作者
久棹
发布于
2025-11-15
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录