Nginx四层负载均衡
Posted 我的紫霞辣辣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx四层负载均衡相关的知识,希望对你有一定的参考价值。
nginx四层负载均衡
什么是四层负载均衡
- 四层负载均衡基于传输层协议包来封装的(如:TCP/IP),那我们前面使用的七层指的是应用层,它的组装在四层基础之上,无论是四层还是七层都是这是OSI网络模型。
四层负载均衡应用场景
- 四层+七层来做负载均衡,四层可以保证七层的负载均衡的高可用性。如nginx就无法保证自己的服务高可以用,需要依赖lvs或者keepalive来做。
- 如 : TCP协议的负载均衡,有些请求是TCP协议的(mysql,ssh),或者说这些请求只需要使用四层进行端口的转发就可以了,所以使用四层负载均衡。比如:mysql读的负载均衡(轮询);比如:端口映射。
四层负载均衡总结
- 四层负载均衡仅能转发TCP/IP协议、UDP协议,通常用来转发端口,如 : tcp/3306、tcp/22、udp/53。
- 四层负载均衡可以用来解决七层负载均衡的端口限制问题(七层负载均衡最大使用65535个端口号)。
- 可以用来解决七层负载均衡的高可用问题(多台后端七层负载聚会能同时的使用)。
- 四层的转发效率比七层的效率高的多,但是仅支持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四层负载均衡的主要内容,如果未能解决你的问题,请参考以下文章