Nginx 实现七层的负载均衡

news/2024/11/13 8:01:29/

一、拓扑结构

							 [vip: 20.20.20.20]
外网 桥接模式(vip)
内网 nat模式[LB1 Nginx]		    [LB2 Nginx]192.168.1.2		192.168.1.3[index]		[milis]		 [videos]	   [images]  	  [news]1.11		 1.21		   1.31			1.41		  1.511.12		 1.22		   1.32			1.42		  1.521.13		 1.23		   1.33			1.43		  1.53...		 ...		   ...			...		      .../web     /web/milis    /web/videos     /web/images   /web/newsindex.html  index.html     index.html      index.html   index.html

分析:
1.准备三台虚拟机
2.每台机器安装nginx

yum -y install nginx

代理机:需要添加一个桥接模式的网卡 ,保证同一网段内其他真实机器可以访问
因为是实验环境 直接VMware上添加即可

9: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:d1:c4:a1 brd ff:ff:ff:ff:ff:ffinet 192.168.101.89/24 brd 192.168.101.255 scope global noprefixroute dynamic ens36valid_lft 53818sec preferred_lft 53818sec

还剩两台服务器这里模仿有五个业务场景 每个业务场景有两台负载机 即一共需要十个机器,这里用新增ip的方式来模拟 剩余两台每台机器新增五个ip

ip addr add 192.168.1.100/24 dev eth0 #添加
ip addr del 192.168.1.100/24 dev eth0 #删除# 需要注意的是这里的网段需要一样才能访问????  这里有疑问  暂时未解决ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:fb:ff:6f brd ff:ff:ff:ff:ff:ffinet 192.168.29.143/24 brd 192.168.29.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.29.160/24 scope global secondary ens33valid_lft forever preferred_lft foreverinet 192.168.29.161/24 scope global secondary ens33valid_lft forever preferred_lft foreverinet 192.168.29.162/24 scope global secondary ens33valid_lft forever preferred_lft foreverinet 192.168.29.163/24 scope global secondary ens33valid_lft forever preferred_lft foreverinet 192.168.29.164/24 scope global secondary ens33valid_lft forever preferred_lft forever
# 这里每个ip 代表一个业务机[index][milis][videos][images][news]

代理机上配置添加:

    upstream index {server 192.168.29.170:80 weight=1 max_fails=2 fail_timeout=2;server 192.168.29.160:80 weight=2 max_fails=2 fail_timeout=2;}upstream news {server 192.168.29.171:81 weight=1 max_fails=2 fail_timeout=2;server 192.168.29.161:81 weight=2 max_fails=2 fail_timeout=2;}upstream milis {server 192.168.29.172:80 weight=1 max_fails=2 fail_timeout=2;server 192.168.29.162:80 weight=2 max_fails=2 fail_timeout=2;}upstream videos {server 192.168.29.173:80 weight=1 max_fails=2 fail_timeout=2;server 192.168.29.163:80 weight=2 max_fails=2 fail_timeout=2;}upstream images {server 192.168.29.174:80 weight=1 max_fails=2 fail_timeout=2;server 192.168.29.164:80 weight=2 max_fails=2 fail_timeout=2;}server {location / {proxy_pass http://index/;}location  /news {proxy_pass http://news/;}location /milis {proxy_pass http://milis/;}location ~* \.(wmv|mp4|rmvb)$ { proxy_pass http://videos; }location ~* \.(png|gif|jpg)$ { proxy_pass http://images;}}# 这里需要注意的点是proxy_pass http://videos;proxy_pass http://milis/;
# 结尾/的问题
# 加/ 的情况假设你的访问路径  curl xxxxx/aa/milis   proxy_pass http://milis/;  结尾加了/   这里会将location后面匹配到的部分去掉  你的url就变为了  http://milis组负载均衡到的的ip/aa 
# 不加/ 的情况 会保留 即 假设你的 curl  xxxx/a.png     通过正则匹配location ~* \.(png|gif|jpg)$     实际url 就是:http://images组负载均衡到的的ip/a.png

服务器
下面以images 举例 首先在conf.d/下新增images.conf这个配置文件

server {listen       192.168.29.164:80;server_name  www.images.com;root         /usr/share/nginx/html/images;access_log   /var/log/nginx/index-access.log  main;# Load configuration files for the default server block.# include /etc/nginx/default.d/*.conf;location /  {index index.html  index.hml;}error_page 404 /404.html;location = /404.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}
} [root@slave01 html]# tree /etc/nginx/
/etc/nginx/
├── conf.d
│   ├── default.conf
│   ├── images.conf
│   ├── index.conf
│   ├── milis.conf
│   ├── news.conf
│   └── videos.conf
├── fastcgi_params
├── mime.types
├── modules -> ../../usr/lib64/nginx/modules
├── nginx.conf
├── scgi_params
└── uwsgi_params

然后根据root /usr/share/nginx/html/images 新增发布文件目录

[root@slave01 html]# tree /usr/share/nginx/
/usr/share/nginx/
└── html├── 50x.html├── images│   ├── a.png│   └── index.html├── index│   └── index.html├── index.html├── milis│   └── index.html├── news│   └── index.html└── videos├── a.mp4└── index.html

http://www.ppmy.cn/news/1527805.html

相关文章

【数据结构-一维差分】力扣1893. 检查是否区域内所有整数都被覆盖

给你一个二维整数数组 ranges 和两个整数 left 和 right 。每个 ranges[i] [starti, endi] 表示一个从 starti 到 endi 的 闭区间 。 如果闭区间 [left, right] 内每个整数都被 ranges 中 至少一个 区间覆盖&#xff0c;那么请你返回 true &#xff0c;否则返回 false 。 已…

4.铝箔缺陷检测项目复盘

硬件 1.装配的时候&#xff0c;在最初阶段就要考虑后面的走线&#xff0c;不能一团乱的塞进去完事&#xff0c;起码相同功能的线要用扎带处理一下。然后理顺好&#xff0c;要不后期理线是灾难。 2.有线标&#xff0c;线号&#xff0c;比如哪根线代表哪个相机&#xff0c;调试的…

CTFShow-信息搜集

Web1&#xff1a; ​ 题目描述&#xff1a;开发注释未及时删除 。 ​ 打开题目后提示web1:where is flag? ​ ctrlu读取源码。 Web2&#xff1a; ​ 题目描述&#xff1a;js前台拦截 无效操作 ​ 打开题目后显示&#xff1a;无法查看源代码 ​ 右键无法用&#xff0c;…

react 基础语法

前置知识 类的回顾 通过class关键字定义一个类 类名首字母大写 class类有constructor构造器 new 一个类得到一个实例 类还有方法&#xff0c;该方法也会在其原型上 static静态数据&#xff0c;访问静态属性通过 类名.id getter和setter getter&#xff1a;定义一个属性&…

继图书管理项目遗留的问题修改

1. 查询查不到&#xff1f; 因为我的数据库变量是下划线命名的&#xff0c;user_id &#xff0c;而一种规范是 &#xff0c;这个时候的实体类的变量要写成驼峰型的&#xff0c;就是userId。 第二种就是直接把数据库变量和实体类变量的名字设成相同的。 这样封装成的对象才能…

Vue 常用高级指令解析

Vue 高级指令的重要性 Vue 高级指令是一种扩展 Vue.js 框架的功能的方式&#xff0c;可以让你在处理 DOM 元素时具有更多的控制权。它们可以通过自定义指令的方式进行编写和应用。 高级指令的重要性在于&#xff0c;它们使开发者能够通过 Vue 框架来创建更加复杂和灵活的交互…

【Vmware16安装教程】

&#x1f4d6;Vmware16安装教程 ✅1.下载✅2.安装 ✅1.下载 官网地址&#xff1a;https://www.vmware.com/ 百度云盘&#xff1a;Vmware16下载 123云盘&#xff1a;Vmware16下载 ✅2.安装 1.双击安装包VMware-workstation-full-16.1.0-LinuxProbe.Com.exe&#xff0c;点击…

使用OpenCV进行模糊检测(拉普拉斯算子)

参考&#xff1a; 使用OpenCV进行模糊检测&#xff08;拉普拉斯算子&#xff09; 代码&#xff1a; # import the necessary packages from imutils import paths import argparse import cv2 import osdef variance_of_laplacian(image):# compute the Laplacian of the ima…