什么是四层负载?
四层负载均衡是基于传输层协议包来封装的(如: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;
}
}
#启动服务
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主配置文件
#写法如下
include /etc/nginx/stream.d/*.conf;
# 重启服务
systemctl restart nginx
#创建lb02虚拟机副本
转发端口还可以用于数据库转发操作上!!!