华为云环境下Docker+Tomcat+Nginx实现负载均衡

本文最后更新于:2022年7月7日 上午

负载均衡:

  • 在多台服务器之间有效地分配客户端请求或网络负载

  • 通过仅向正常服务器发送请求确保高可用性和可靠性

  • 业务不中断地情况下,按需弹性分配服务器资源

以减少宕机时间、提供系统可用性、动态扩展性能、加快访问速度。

实例演示

要求部署一台Nginx和三台Tomcat服务器,且Ngnix需要实现三种策略:

  • 轮询
  • 权重,三台Tomcat服务器的权重为1, 3, 5
  • IP Hash

购买云服务器和公网IP

买的是华为云的弹性云服务器,配置选基础的就可以,因为只是实验用途,所以计费模式选的按需计费

然后镜像的话选CentOS7就行,一开始选的Ubuntu发现教程很少,然后换成CentOS8发现后续过程会出现一些权限问题(qwq踩坑达人

ECS

还需要买一个弹性公网IP,不然在服务器上没法上网(好像

带宽也就选的默认的5Mb/s

IP

然后恭喜你就会拥有一台云服务器!

Cloud Server

设置安全组入规则,为了后续的端口正常访问

可以点击远程登录就可以对它操作啦

这里有两种登录方式,推荐第一种CloudShell哦,那里面可以直接CV复制粘贴,还有资源管理器的可视化显示

CloudShell

输入之前设置的密码就可以登录成功啦

安装Docker

1
2
3
4
5
yum -y install docker
# 启动docker守护进程
systemctl start docker.service
# 拉取最基础的image镜像
docker pull centos

拉取Tomcat Nginx镜像

1
2
docker pull tomcat
docker pull nginx

docker images

创建Tomcat Nginx容器

1
2
3
4
docker run -itd --name myNginx -p 8081:80 nginx:latest /bin/bash
docker run -itd --name myTomcat1 -p 8086:8080 tomcat:latest /bin/bash
docker run -itd --name myTomcat2 -p 8087:8080 tomcat:latest /bin/bash
docker run -itd --name myTomcat3 -p 8088:8080 tomcat:latest /bin/bash

docker ps

部署Nginx容器

1
2
3
docker exec -it <nginx Container ID> /bin/bash
/usr/sbin/nginx
exit

打开浏览器,输入你的公网IP地址:设置的端口号查看是否部署成功

Nginx

部署Tomcat容器

总共要部署三个,操作都是一样的哦

1
2
3
4
5
6
7
docker exec -it <Tomcat Container ID> /bin/bash
ls
mv webapps webapps1
mv webapps.dist webapps
cd bin
./startup.sh
exit

打开浏览器,输入你的公网IP地址:设置的端口号查看是否部署成功

Tomcat

修改Tomcat默认主页内容

现在三个Tomcat服务器上的主页内容都是一样的,如果通过Nginx代理访问的话无法区分它们,所以要修改它们的主页内容

分别进入三个Tomcat容器修改网页代码

1
2
3
docker exec -it <Tomcat container ID> /bin/bash
cd webapps/ROOT
vim index.jsp

加一小段不同的字就行

webapps/ROOT/index.jsp

输入vim命令后会出现命令不存在的情况,需要在服务器内安装vim

1
2
apt-get update
apt-get install vim

网络原因可能会很慢,但是耐心等待就好

最终的修改效果如下:

Tomcat#1

Tomcat#2

Tomcat#3

Nginx负载均衡配置

首先进入Nginx容器,编辑配置文件,开启Nginx代理转发

1
2
3
docker exec -it <Nginx container ID> /bin/bash
cd /etc/nginx/conf.d
vim default.conf

/etc/nginx/conf.d/default.conf

轮询法

将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。

修改upstream模块

1
2
3
docker exec -it <Nginx container ID> /bin/bash
cd /etc/nginx
vim nginx.conf

nginx.conf

重启Nginx服务器

1
2
3
docker restart <Nginx container ID>
docker exec -it <Nginx container ID> /bin/bash
/usr/sbin/nginx

浏览器访问Nginx服务器,并刷新进行多次访问

发现访问顺序为Tomcat#1-#2-#3

权重法

权重(weight)默认值为1,权重越高,被分配的请求数量越多,将请求顺序且按照权重分配到后端再进行轮询。

修改upstream模块

1
2
3
docker exec -it <Nginx container ID> /bin/bash
cd /etc/nginx
vim nginx.conf

nginx.conf

重启Nginx服务器

1
2
3
docker restart <Nginx container ID>
docker exec -it <Nginx container ID> /bin/bash
/usr/sbin/nginx

浏览器访问Nginx服务器,并刷新进行多次访问

9次访问中Tomcat#11次,Tomcat#23次,Tomcat#35次,与设置的权重相符

IP_HASH法

根据获取请求客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客户端要访问服务器的序号。每个请求固定访问同一个后端服务器,这样可以做到会话保持,解决session同步问题。

修改upstream模块

1
2
3
docker exec -it <Nginx container ID> /bin/bash
cd /etc/nginx
vim nginx.conf

nginx.conf

重启Nginx服务器

1
2
3
docker restart <Nginx container ID>
docker exec -it <Nginx container ID> /bin/bash
/usr/sbin/nginx

浏览器访问Nginx服务器,并刷新进行多次访问

发现一直访问的是Tomcat#1


本文作者: 31
本文链接: http://uuunni.github.io/2022/05/10/nginx-load-balancing/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!