什么是四层负载?

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

四层负载均衡应用场景

1、四层+七层来做负载均衡,四层可以保证七层的负载均衡的高可用性;如:nginx就无法保证自己的服务高可用,需要依赖LVS或者keepalive。
2、如:tcp协议的负载均衡,有些请求是TCP协议的(mysql、ssh),或者说这些请求只需要使用四层进行端口的转发就可以了,所以使用四层负载均衡。
  • 总结
1、四层负载均衡仅能转发TCP/IP协议、UDP协议、通常用来转发端口,如:tcp/22、udp/53;
2、四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用65535个端口号)
3、四层负载均衡可以解决七层负载均衡高可用问题;(多台后端七层负载均衡能同事的使用)
4、四层的转发效率比七层的高得多,但仅支持tcp/ip协议,不支持http和https协议;
5、通常大并发场景通常会选择使用在七层负载前面增加四层负载均衡。

Nginx四层负载均衡场景实践

要求:

1、通过访问负载均衡的5555端口,实际是后端的web01的22端口在提供服务;
2、通过访问负载均衡的6666端口,实际是后端的mysql的3306端口在提供服务。

环境准备:

主机名 外网IP 内网IP 角色 环境
web01 10.0.0.7 172.16.1.7 we网站 nginx+php
web02 10.0.0.8 172.16.1.8 web网站 nginx+php
lb01 10.0.0.5 172.16.1.5 七层负载 nginx
lb02 10.0.0.6 172.16.1.6 四层负载 nginx
db01 10.0.0.51 172.16.1.51 数据库 mariadb

web01和web02部署:

# 添加nginx和php yum源
    #添加php源
[root@web01 ~]# vim /etc/yum.repos.d/php.repo
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
    #添加nginx官方源
[root@web01 ~]# 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
yum install -y nginx
# 下载php    //如果下载不成功是因为已经安装过其他版本的php了,卸载即可
yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
#创建用户 www
[root@web01 ~]# groupadd -g 666 www &&  useradd -g 666 -u 666 -s /sbin/nologin -M www
[root@web01 ~]# id www
uid=666(www) gid=666(www) groups=666(www)
# 修改nginx配置文件使用www用户
[root@web01 ~]# vim /etc/nginx/nginx.conf
user  www;   #//第一行修改user即可
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
# 修改php配置文件使用www用户   //php的配置文件注释是用分号 “;”
[root@web01 ~]# vim /etc/php-fpm.d/www.conf
; Start a new pool named 'www'.
[www]

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = www     #//此行改为www
; RPM: Keep a group allowed to write in log dir.
group = www    #//此行改为www
# 编辑nginx网页配置文件
vim /etc/nginx/conf.d/jj.conf
server{
    listen 80;
    server_name jiujiu.xxx.com;
    root /code;
    index index.html;
}
#web01的配置拷贝至web02
scp /etc/nginx/nginx.conf root@10.0.0.8:/etc/nginx/
scp /etc/php-fpm.d/www.conf root@10.0.0.8:/etc/php-fpm.d/
scp /etc/nginx/conf.d/jj.conf root@10.0.0.8:/etc/nginx/conf.d/
#创建站点目录    //web02改为"this is web02"
mkdir /code
echo "this is web01" >/code/index.html
#检测语法;
nginx -t
# 本地域名解析
10.0.0.7 haha.xxx.com
10.0.0.8 haha.xxx.com

lb01部署七层负载:

# 安装nginx
yum install -y nginx
# 编写nginx配置文件
vim /etc/nginx/conf.d/qcdl.conf
upstream node{
    server 172.16.1.7;
    server 172.16.1.8;
    }
server{
    listen 80;
    server_name qcdl.xxx.com;
    location /{
    proxy_pass  http://node;
    include /etc/nginx/proxy_params;
    }
}
# 添加优化文件
vim /etc/nginx/proxy_params
----------------------------------------------------------------------------------------------------
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;

proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
-----------------------------------------------------------------------------------------------------
# 启动服务
systemctl start nginx
# 本地域名解析
10.0.0.5 qcdl.xxx.com

lb02四层负载部署:

# 添加nginx官方源
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
yum install -y nginx
# 四层负载配置文件    //此模块写在events和http模块之间即可
vim /etc/nginx/nginx.conf
stream{
    upstream backend{
    server 172.16.1.5:80;
    }
server{
    listen 90;
    proxy_pass backend;
    }
}

image-20230508143956607

#启动服务
systemctl start nginx
#浏览器访问
10.0.0.6:910

使用upstream实现端口转发22端口的转发

需求:10.0.0.6的456端口转发10.0.0.7的22端口

web01:

#停用web01的eth0网卡
ifdown etho

lb02部署:

#语法:       //与四层负载语法类似
stream {
    upstream backend{
    server 172.16.1.7:22;
    }
    server{
    listen 456;
    proxy_pass backend;
    }
}
#但上面这种写法只能识别一个stream模块
#所以,我们可以把stream模块里的server模块写入到一个文件里,再把文件写入到nginx主配置文件中
#先创建一个目录
mkdir /etc/nginx/stream.d 
#编写配置文件           //如果有多个server模块,那么模块名就不能同名,否则报错
vim /etc/nginx/stream.d/daili.conf
stream{
    upstream backend{
    server 172.16.1.5:80;
    }
    server{
        listen 90;
        proxy_pass backend;
    }
    upstream web01_22{
        server 172.16.1.7:22;
    }
    server{
        listen 456;
        proxy_pass web01_22;
    }
}
#添加至nginx主配置文件
#写法如下

image-20230508145519630

include /etc/nginx/stream.d/*.conf;
# 重启服务
systemctl restart nginx
#创建lb02虚拟机副本

image-20230508145704991

image-20230508145718399

image-20230508145731415

转发端口还可以用于数据库转发操作上!!!