LNMP架构拆分
6190 字
31 分钟
LNMP架构拆分

LNMP架构拆分
[TOC]
业务背景

通过
负载均衡,让用户平均的访问我们两台web服务器Nginx 和 PHP 分别部署在两台web服务器上
静态的数据不能放在web本地磁盘,都得放在NFS上
动态的数据放在数据库上提交的任何信息都是 NFS 和 数据库 来处理的
我们的两台web服务器上,没有任何数据的落盘 也就是没有任何数据,需要写入到我们web本地磁盘上
微服务解耦合
✅ 简单概括“微服务解耦合”:
把一个
大系统拆成多个独立的小服务每个服务只负责一个功能,单独开发、部署、运行和扩展
彼此之间通过接口通信,互不影响
🌟 再精炼一下:
“我不一次性给你所有功能,而是按需提供;每个功能独立放在自己的服务器上,各自维护、互不牵连”
💡 解耦合的核心好处:
- 故障隔离:一个服务挂了,不影响其他服务
- 灵活迭代:改一个功能,不用重新部署整个系统
- 技术异构:不同服务可以用不同语言或框架
- 独立扩展:哪个服务压力大,就单独给它加机器
虽然成本高(运维、网络、监控更复杂),但换来的是 更高的灵活性和可维护性
业务层解耦:
✅ 将不同的业务功能模块,抽象为独立的接口或服务
- 就是一个接口,点过去,直接跳走了
💡 好处:修改一个业务模块不影响其他模块
服务层解耦:
✅每个
微服务应独立部署、独立运行,避免把多个服务部署在同一物理或虚拟服务器上,防止“故障传播”和“资源争抢”
数据库拆分

[root@web01 ~]#netstat -lntupActive Internet connections (only servers)tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 956/php-fpm: mastertcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1006/nginx: mastertcp6 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
'IP地址:10.0.0.51'# 部署mariadb服务并启动[root@db01 ~]#yum -y install mariadb-server[root@db01 ~]#systemctl start mariadb[root@db01 ~]#systemctl enable mariadb
# 启动起来之后,不需要修改密码,因为我们需要把原来的库(web01上的数据库)搬过来,原来的用户名和密码也搬过来!导出&导入
# 我们的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的数据库了修改数据库的指向
'数据库中,有默认的保护措施,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.comERROR 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.comWelcome to the MariaDB monitor.MariaDB [(none)]># 本地测试,可以连接到数据库
'切换到web01'# 远程测试web01执行:[root@web01 wordpress]#mysql -h 172.16.1.51 -ujiuzhao -poldboy123.comWelcome to the MariaDB monitor.MariaDB [(none)]> quit # 退出# 使用jiuzhao用户远程连接数据库测试
3.停止web01服务器上的mariadb[root@web01 ~]#systemctl stop mariadb[root@web01 ~]#systemctl disable mariadbRemoved /etc/systemd/system/multi-user.target.wants/mariadb.service.Removed /etc/systemd/system/mysql.service.Removed /etc/systemd/system/mysqld.service.# 浏览器访问:wordpresshttp://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.phpdefine( '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服务器扩展

为什么要扩展多台web节点???单台web服务器能抗住的访问量是有限的,配置多台web服务器能提升更高的访问速度
扩展多台web解决了什么问题1.单台web节点如果故障,会导致业务down机2.多台web节点能保证业务的持续稳定,扩展性高3.多台web节点能有效的提升用户访问网站的速度创建web02
'IP地址:10.0.0.8'[root@web02 ~]#rpm -qa nginx php# 什么都没有安装
#Nginx1.配置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:002.通过官网仓库安装nginx[root@web02 ~]# yum -y install nginx3.将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.confuser www;
#PHP1.安装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.confuser = wwwgroup = www
3.创建www用户并测试启动服务[root@web02 ~]# groupadd -g666 www[root@web02 ~]# useradd -u666 -g666 -M -s /sbin/nologin www[root@web02 ~]#id wwwuid=666(www) gid=666(www) groups=666(www)[root@web02 ~]#nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: 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 -lntuptcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1687/php-fpm: mastetcp 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]#lltotal 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.phpdrwxr-xr-x 9 1006 1006 4096 Jun 16 2022 wp-admin......'不要有多级目录/code/wordpress/wordpress'[root@web02 tmp]#ll /code/zhtotal 96drwxr-xr-x 36 root root 4096 Jan 31 2022 appdrwxr-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.phpdrwxr-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 wordpressdrwxr-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 /codetotal 8drwxr-xr-x 5 www www 4096 Jun 16 2022 wordpressdrwxr-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解析到web0210.0.0.8 wp.kpyun.com zh.kpyun.com# 更换IP地址即可,不让它映射到web01,只映射到web02浏览器访问:http://wp.kpyun.com/http://zh.kpyun.com/

静态资源实现一致性
Windows中hosts映射为web0210.0.0.8 www.wp.com# 并上传一张图片
- 右键图片---->在新标签页中打开图像

'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)# 验证查看,是否能够找到这张图片(静态资源)

❤️关键点
web02上传一张图片,它存储web02的磁盘中,web01无法访问
要找到wordpres存储
静态资源的路径两台web服务器的 静态资源 都要存储在NFS服务器中
拆分静态资源至独立服务器# 增加一台NFS服务器(10.0.0.31),实现共享存储为什么拆分静态资源至独立存储服务器???当后端的web节点出现多台时,会导致用户上传的图片、视频附件等内容仅上传至一台web服务器,那么其他的web服务器则无法访问到该图片
新增一台nfs存储解决了什么问题???1.保证了多台web节点静态资源一致2.有效节省多台web节点的存储空间3.统一管理静态资源,便于后期推送至CDN进行静态资源加速部署NFS服务
10.0.0.31服务器1.安装nfsyum -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 wwwuid=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 0drwxr-xr-x 2 root root 6 Feb 8 20:06 wpdrwxr-xr-x 2 root root 6 Feb 8 20:06 zh[root@nfs ~]#chown -R www.www /data/[root@nfs ~]#ll /data/total 0drwxr-xr-x 2 www www 6 Feb 8 20:06 wpdrwxr-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.31Export 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.31Export 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 -hFilesystem Size Used Avail Use% Mounted on172.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 -hFilesystem Size Used Avail Use% Mounted on172.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的wordpreshttp://wp.kpyun.com
小坑

为什么还是不对呢???用户上传--->Nginx(www)--->php(www)--->nfs(www)# 我们明明统一了用户了[root@web02 ~]#ll /code'web服务器上业务代码'drwxr-xr-x 5 www www 4096 Feb 8 17:51 wordpressdrwxr-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 wpdrwxr-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 0drwxr-xr-x 3 www www 16 Feb 8 20:13 2026# web01和web02和nfs操作的是一个目录,在哪台机器上改都一样!
# 浏览器再次进行测试上传'上传成功'
代理
正向代理
-
作用对象:代表客户端(用户)去访问外部资源
-
典型场景:公司内网通过
代理服务器访问互联网

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

增加负载均衡

增加lb01(负载均衡服务器)IP地址;10.0.0.5(公网);局域网(172.16.1.5)
用户访问-->负载均衡服务器10.0.0.5(公网)-->局域网(172.16.1.5)访问后面的服务器1)我们公网IP地址只需要在负载均衡上配置就可以了!2)后面的服务器全部配置局域网IP地址# 不需要用公网,浪费,没有意义!
'用户只需要和负载均衡建立连接就可以了,由负载均衡代理着用户,请求后面的服务器'负载均衡服务器默认按照请求,平均分担到后端服务器平均分担:你一个它一个....# 负载均衡是基于反向代理实现的!粗略配置
1.创建10.0.0.5 lb012.部署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服务并开机自启动
负载均衡服务器本身通常不需要修改启动用户为 www1)它只负责转发 HTTP 请求到后端 Web 服务器2)它不运行 PHP/Python 等应用代码,也不直接访问后端 Web 应用的文件目录3)因此,无需将其运行用户改为 www1.配置nginx反向代理[root@lb01 conf.d]#rm -rf default.conf# 删除默认的配置[root@lb01 conf.d]#vim lb.confserver { listen 80; server_name lb01.com; location / { proxy_pass http://10.0.0.7; }}[root@lb01 conf.d]#nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: 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.confserver { 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 -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 conf.d]#systemctl reload nginx
4.web01本地测试[root@web01 conf.d]#vim /etc/hosts10.0.0.7 test.kpyun.com10.0.0.7 php.kpyun.com[root@web01 conf.d]#curl test.kpyun.comweb01_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]#lltotal 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.confserver { 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.510.0.0.5 lb01.com
浏览器访问:http://lb01.com/用户访问lb01.com --> 10.0.0.7(跳转访问)'proxy_pass http://10.0.0.7;'

# 我们再次修改负载均衡的配置配置文件[root@lb01 conf.d]#vim /etc/hosts10.0.0.7 test.kpyun.com# lb01自己先做解析[root@lb01 ~]#cd /etc/nginx/conf.d/[root@lb01 conf.d]#vim lb.confserver { listen 80; server_name lb01.com; location / { proxy_pass http://test.kpyun.com; # 现在指向test.kpyun.com }}[root@lb01 conf.d]#nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: 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解析才能访问到它
优化配置


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.log10.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,才会显示它!1)修改子配置文件[root@lb01 conf.d]#vim lb.confserver { 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 -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: 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/


最终优化
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 秒(超时后中断连接)使用场景:后端处理耗时较长(如复杂计算、长轮询)时需调高'这三个参数都有默认值!'
2. 缓冲控制参数# 负载均衡服务器是边收边传!收到用户一个请求,传给后面一个请求# 而不是堆积,再一下子把所有请求给webproxy_buffering on;作用:启用代理响应缓冲(默认开启)效果:Nginx 会先将后端返回的响应数据存入内存/磁盘缓冲区,再逐步发送给客户端'是web返回的响应,而不是用户发的请求!'优点:减轻后端服务器压力,优化客户端的传输效率缺点:可能增加内存占用,有一定延时# 用户在前几秒看到空白,然后突然刷出全部内容
proxy_buffer_size 32k;作用:设置单个缓冲区的大小,用于存储后端响应的第一部分(如响应头)值:32KB(默认通常为 4KB 或 8KB)关键点:这部分数据会直接发送给客户端,需确保足够容纳响应头
proxy_buffers 4 128k;作用:设置缓冲区的数量和大小,用于存储后端响应的内容体值:4 个缓冲区 × 每个 128KB(总缓冲容量 = 4 × 128KB = 512KB)调整依据:1)响应内容较大(如文件下载)时,需增加缓冲区数量和大小2)内存有限的服务器需谨慎设置,避免 OOM(内存溢出)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 -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web02 ~]#systemctl reload nginx[root@web02 ~]#vim /etc/hosts10.0.0.8 test.kpyun.com# 修改web02的映射文件[root@web02 ~]#curl test.kpyun.comweb02-index# 成功访问
2)lb01配置(10.0.0.5)[root@lb01 conf.d]#cat lb.confupstream 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 -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@lb01 conf.d]#systemctl reload nginx[root@lb01 conf.d]#vim /etc/hosts10.0.0.5 test.kpyun.com[root@lb01 conf.d]#curl test.kpyun.comweb01_index[root@lb01 conf.d]#curl test.kpyun.comweb02-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; }}文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
LNMP架构
Web服务实战部署LNMP架构,涵盖PHP-FPM配置、FastCGI通信、MySQL集成及WordPress完整部署流程
2
Tomcat动静分离
Web服务Tomcat动静分离与多端适配实战,通过Redis共享Session、Nginx正则分发及User-Agent路由
3
搭建企业内部yum仓库
Web服务企业内网YUM私有仓库搭建,使用createrepo+Nginx实现RPM包统一管理与离线快速分发
4
Keepalived 高可用
Web服务Keepalived高可用集群实战,讲解VRRP原理、主备部署、脑裂处理及Nginx健康检查自动切换
5
https证书部署
Web服务HTTPS证书部署与TLS加密实战,涵盖加密原理、自签名与真实证书配置及SSL参数优化
随机文章随机推荐



