Nginx四层负载均衡详解

Nginx四层负载均衡

什么是四层负载均衡

  • 四层负载均衡基于传输层协议包来封装的(如:TCP/IP),那我们前面使用的七层指的是应用层,它的组装在四层基础之上,无论是四层还是七层都是这是OSI网络模型。

四层负载均衡应用场景

  1. 四层+七层来做负载均衡,四层可以保证七层的负载均衡的高可用性。如nginx就无法保证自己的服务高可以用,需要依赖lvs或者keepalive来做。
    在这里插入图片描述
  2. 如 : TCP协议的负载均衡,有些请求是TCP协议的(mysql,ssh),或者说这些请求只需要使用四层进行端口的转发就可以了,所以使用四层负载均衡。比如:mysql读的负载均衡(轮询);比如:端口映射。
    在这里插入图片描述

四层负载均衡总结

  1. 四层负载均衡仅能转发TCP/IP协议、UDP协议,通常用来转发端口,如 : tcp/3306、tcp/22、udp/53。
  2. 四层负载均衡可以用来解决七层负载均衡的端口限制问题(七层负载均衡最大使用65535个端口号)。
  3. 可以用来解决七层负载均衡的高可用问题(多台后端七层负载聚会能同时的使用)。
  4. 四层的转发效率比七层的效率高的多,但是仅支持tcp/ip协议,不支持http协议或者https协议。

实验环境

lb03-4层负载 				192.168.15.3				172.16.1.3
lb01-7层负载					192.168.15.5				172.16.1.5		
lb02-7层负载					192.168.15.6				172.16.1.6
nfs							192.168.15.31				172.16.1.31
mysql/redis					192.168.15.51				172.16.1.51	
web01						192.168.15.7				172.16.1.7
web02						192.168.15.8				172.16.1.8

我们这一次的实验,是接着Nginx七层负载均衡搭建完成后继续搭建的。
注意 : 我们lb01服务器里面有一个nginx的健康检查模块,本次实验是不需要的。

同步lb01服务器七层负载均衡至lb02服务器

1. 在lb02上面配置nginx的yum源
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

2. 在lb02上面安装nginx服务
yum -y install nginx

3. 将lb01上面的配置文件拷贝到lb02服务器上
scp -rp root@172.16.1.5:/etc/nginx /etc/					# 在lb02上面执行

4. 编译从lb01服务器上拷贝到lb02服务器的多余的配置文件
gzip proxy_web.conf
gzip default.conf

5. 查看nginx配置文件指定目录下的文件名
ls /etc/nginx/conf.d
# default.conf.gz  proxy_nana.com.conf  proxy_php.conf  proxy_web.conf.gz

6. 启动nginx
nginx -t
systemctl restart nginx
systemctl enable nginx
  • 我们输入zh.nana.com会出现502报错,原因是因为WeCenter软件默认开启了session缓存。我们目前搭建的三个服务,只有php myadmin需要将session写入radis,wordpress和WeCenter都是默认将session写入数据库的。
  • 我们需要关闭web01服务器和web02服务器的session缓存。
1. 关闭web01服务器session缓存
vim /etc/php.ini
session.auto_start = 0		# 第1294行

2. 重启web01服务器的nginx服务和php服务
systemctl restart nginx
systemctl restart php-fpm

3. 关闭web02服务器的session缓存
vim /etc/php.ini
session.auto_start = 0		# 第1294行

4. 重启web02服务器的nginx服务和php服务
systemctl restart nginx
systemctl restart php-fpm

测试

1. 在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析
# 192.168.15.5		zh.nana.com		blog.nana.com	web.nana.com	php.nana.com
192.168.15.6		zh.nana.com		blog.nana.com	php.nana.com

- 测试
我们先打开本机的cmd,输入ping blog.nana.com。
查看一下域名解析的ip地址是不是lb02的ip地址(192.168.15.6)。
我们打开浏览器输入blog.nana.com ; zh.nana.com ; php.nana.com。
如果都可以正常访问到网页的页面,那么就表示我们lb02七层负载均衡搭建成功了。

配置lb03服务器Nginx四层负载均衡

  • 配置四层负载均衡,需要用到stream模块,我们可以先通过nginx -V命令查看当前安装的nginx版本有没有--with-stream模块。
  • 注意 : 四层负载均衡和http层是没有任何关系的,不能把四层负载均衡配置在http层里面! ! !
- lb03配置nginx四层负载均衡
1. 配置nginx的yum源
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

2. 下载nginx软件包
yum -y install nginx

3. 修改配置文件
3.1 在主配置文件中添加四层负载均衡配置的文件路径
vim /etc/nginx/nginx.conf
events {
  ....
}

include /etc/nginx/conf.c/*.conf;
# 注意: 不能把四层负载均衡配置文件写在http层里面!!!
# 不可以把配置文件的路径写成/etc/nginx/conf.d,因为http层里面包含了/etc/nginx/conf.d文件路径,会发生冲突。

http {
    ....
}

3.2 创建四层负载均衡的配置文件
mkdir /etc/nginx/conf.c
cd /etc/nginx/conf.c
vim lb_domain.conf
stream{
        upstream lb {						# 创建虚拟服务池,定义虚拟服务池的名称为lb
                server 172.16.1.5:80 weight=5 max_fails=3 fail_timeout=30s;		# 将服务器lb01添加至定义好的虚拟服务池lb
                server 172.16.1.6:80 weight=5 max_fails=3 fail_timeout=30s;		# 将服务器lb02添加至定义好的虚拟服务池lb
        }

        server {
                listen 80;							# 四层负载均衡监听的在80端口
                proxy_connect_timeout 3s;			# 连接超时时间
                proxy_timeout 3s;					# 响应超时时间
                proxy_pass lb;						# 指定资源池名称,注意四层负载均衡不能写http名称!!!
        }
}

4. 删除lb03服务器中http层监听端口的配置文件
rm -rf /etc/nginx/conf.d/default.conf
# 四层负载均衡默认监听的80端口和七层负载均衡默认监听的80端口发生冲突,无法启动服务
# lb03服务器我们只是用来做四层负载均衡,不需要http层来监听端口,直接删除default.conf文件即可。

5. 重启nginx服务
nginx -t
systemctl start nginx
systemctl enable nginx

- 测试
在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析(注释掉其他的域名解析)
192.168.15.3			blog.nana.com 		zh.nana.com

打开cmd,输入ping blog.nana.com,解析的ip地址为192.168.15.3。
我们打开浏览器,输入blog.nana.com,可以正常访问到页面,这就代表客户端传输的数据包是由四层负载进行转发的。

四层负载均衡记录日志

  • Nginx软件的日志是在主配置文件中通过log_format来定义的。我们打开/etc/nginx/nginx.conf主配置文件,发现只有http层有一个log_format。http层属于七层负载均衡的协议,跟四层负载均衡是没有任何关系的,所以我们在四层负载均衡中是看不到日志文件的内容的。我们需要在四层负载均衡stream下重新定义日志的参数。
1. 编辑四层负载均衡的配置文件
vim /etc/nginx/conf.c/lb_domain.conf
stream{
        
log_format proxy '$remote_addr $remote_port - $msec - [$time_local] $status $protocol'
					# 远程客户端地址 远程客户端随机端口 毫秒 		时间 	  状态   	协议
                 '"$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"';
					# 虚拟链接池的主机地址   	大小				连接的时间
								
                access_log /var/log/nginx/proxy.log proxy;
							# 日志的路径 使用的变量为proxy

        upstream lb {
                server 172.16.1.5:80 weight=5 max_fails=3 fail_timeout=30s;
                server 172.16.1.6:80 weight=5 max_fails=3 fail_timeout=30s;
        }       
        
        server {
                listen 80;
                proxy_connect_timeout 3s;
                proxy_timeout 3s;
                proxy_pass lb;
        }       
}       

2. 重启nginx服务
systemctl restart nginx

- 测试
在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析(注释掉其他的域名解析)
192.168.15.3			blog.nana.com 		zh.nana.com

我们打开浏览器输入:zh.nana.com,在lb03服务器四层负载均衡服务器中输入tail -f /var/log/nginx/proxy.log
不断刷新浏览器,我们会发现lb03服务器中日志中Tcp连接的ip地址是在lb01服务器和lb02服务器中来回切换的。

使用Nginx负载均衡代理tcp协议,实现端口映射

  • 请求负载均衡 : 端口 5555 ===> 172.16.1.7 : 22
  • 请求负载均衡 : 端口 6666 ===> 172.16.1.51 : 3306
1. 修改Nginx四层负载的配置文件
vim /etc/nginx/conf.c/lb_domain.conf
stream{

log_format proxy '$remote_addr $remote_port - $msec - [$time_local] $status $protocol'
                 '"$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"';

                access_log /var/log/nginx/proxy.log proxy;

# 转发ssh的22端口
        upstream ssh_7 {
                server 172.16.1.7:22;
        }

# 转发mysql的3306端口
        upstream mysql_51 {
                server 172.16.1.51:3306;
        }

        server {
                listen 5555;
                proxy_connect_timeout 60s;
                proxy_timeout 60s;
                proxy_pass ssh_7;
        }

        server {
                listen 6666;
                proxy_connect_timeout 60s;
                proxy_timeout 60s;
                proxy_pass mysql_51;
        }
}

2. 重启nginx服务
systemctl restart nginx

3. 查看端口号
netstat -lntp
# tcp        0      0 0.0.0.0:5555            0.0.0.0:*               LISTEN      17681/nginx: master
# tcp        0      0 0.0.0.0:6666            0.0.0.0:*               LISTEN      17681/nginx: master 

- 测试
我们打开Xsehll软件,输入ssh root@192.168.15.3:5555。可以直接登陆web01(172.16.1.7)服务器。
我们打开Navicat软件,输入ip:192.168.15.3;输入port:6666。可以直接连接上db01(172.16.1.51)的数据库。

代理与转发之间的差别

在这里插入图片描述

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx四层负载均衡是通过TCP协议进行端口转发来实现的。它适用于转发非HTTP应用,比如TCP/80、TCP/443、TCP/3306、TCP/22和UDP/53等。四层负载均衡可以解决七层负载均衡的高可用性问题,同时也可以解决七层负载均衡的端口数限制问题。相比于七层负载均衡四层转发的效率更高,但功能相对较弱,只支持TCP/IP协议。\[3\] 在nginx的配置文件中,可以通过在stream块中配置upstream来实现四层负载均衡。例如,在nginx.conf文件中配置了一个upstream,指定了多个后端服务器的IP和端口,然后通过proxy_pass指令将请求转发给这些后端服务器。\[2\] 需要注意的是,nginx四层负载均衡不能配置HTTP层,只能进行TCP协议的转发。如果需要进行HTTP层的负载均衡,需要在nginx.conf文件中进行配置。\[2\] #### 引用[.reference_title] - *1* [Nginx四层负载均衡详解](https://blog.csdn.net/Yosigo_/article/details/117216333)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [nginx实现四层负载均衡](https://blog.csdn.net/m0_46090675/article/details/119830336)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值