Nginx四层负载均衡

Posted 我的紫霞辣辣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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				

我们这一次的实验,是接着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

四层负载均衡记录日志

  • 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

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

使用Nginx负载均衡实现端口映射

  • 请求负载均衡 : 172.16.1.3 : 5555 ===> 172.16.1.7 : 22
  • 请求负载均衡 : 172.16.1.3 : 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;

        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;
        }

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

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

        server {
                listen 80;
                proxy_connect_timeout 3s;
                proxy_timeout 3s;
                proxy_pass lb;
        }

        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 

以上是关于Nginx四层负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

四层负载均衡技术

nginx四层负载均衡

运维丨Nginx四层负载均衡的配置指南

使用Nginx进行四层负载均衡

180天云计算小白到大神-Nginx TCP负载均衡

Nginx四层负载均衡