Docker部署Nginx+Tomcat实现负载均衡

docker部署nginx+tomcat实现负载均衡

1,部署一台Nginx和三台Tomcat服务器

2,Ngnix需要实现三种策略:

1)轮询;

2)权重,三台服务器的权重为1,3,5;

3)IP Hash。

最终实现的效果是,本地电脑通过网页访问云服务器时,网页能够体现Ngnix三种策略的结果。

1 申请华为云服务器并配置环境

1.1 申请服务器

本实验申请的版本是1vCPUs, 内存1Gib,运行系统为Ubuntu 18.04的服务器

image

在申请后使用ssh进行登录。

1.2 安装Docker

安装Docker的步骤主要参考官方文档:https://docs.docker.com/engine/install/ubuntu/

# 1. Update the apt package index and install packages to allow apt to use a repository over HTTPS:
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 2. Add Docker’s official GPG key:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 3. Use the following command to set up the stable repository. 
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 4. install docker engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

安装完成后可以查看一下docker的版本

docker --version

image

1.3 拉取nginx和tomcat镜像

docker pull nginx
docker pull tomcat

查看已经拉取到的镜像

image

2 创建nginx和tomcat容器

2.1 创建1个nginx容器

在创建nginx容器之前,我们先在本地创建用于放置nginx配置的文件夹~/docker/nginx

mkdir docker
cd docker
mkdir nginx

启动nginx容器,将配置文件复制到文件夹中

docker cp 0c025fba7dc5:/etc/nginx/nginx.conf ~/docker/nginx/
docker cp 0c025fba7dc5:/etc/nginx/conf.d/default.conf  ~/docker/nginx/

然后停掉并删除容器

docker stop 0c025fba7dc5
docker rm 0c025fba7dc5

然后重新启动nginx容器,并将配置挂载到容器上

docker run --name myNginx -p 80:80 -v ~/docker/nginx/nginx.conf:/etc/nginx/nginx.conf -v ~/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf -itd nginx

2.2 创建3个tomcat容器

创建三个tomcat容器myTomcat1,myTomcat2,myTomcat3,端口号分别为8081,8082,8083。

docker run -itd --name myTomcat1 -p 8081:8080 tomcat
docker run -itd --name myTomcat2 -p 8082:8080 tomcat
docker run -itd --name myTomcat3 -p 8083:8080 tomcat

查看已经创建的容器:

image

创建好的tomcat,还要设置webapps文件夹用于访问,进入每个tomcat容器,然后执行下面的命令就行

cp -r webapps.dist/* ./webapps
rm -rf webapps.dist

添加防火墙的端口:

firewall-cmd --zone=public --add-port=80/tcp --permanent # 这个是nginx的端口
firewall-cmd --zone=public --add-port=8081/tcp --permanent
firewall-cmd --zone=public --add-port=8082/tcp --permanent
firewall-cmd --zone=public --add-port=8083/tcp --permanent

然后reload

firewall-cmd --reload

查看结果

firewall-cmd --list-all

image

为了能够访问华为云服务器的8081,8082,8083端口,需要对服务器添加入口规则(80端口已经默认有了就不用添加了):

image

添加完成后就能访问tomcat了:

image

为了区分不同的tomcat容器,我们创建3个index.jsp文件,内容分别为this is tomcat1this is tomcat2this is tomcat3,然后复制到tomcat容器中

docker cp index1.jsp myTomcat1:/usr/local/tomcat/webapps/ROOT/index.jsp
docker cp index2.jsp myTomcat2:/usr/local/tomcat/webapps/ROOT/index.jsp
docker cp index3.jsp myTomcat3:/usr/local/tomcat/webapps/ROOT/index.jsp

这样我们就能区分不同的tomcat容器了:

image

image

image

3 nginx负载均衡

3.1 轮询方式

在本地目录创建容器中nginx.conf文件的副本nginx1.conf,修改后再挂载到容器中,下面是对nginx1.conf所做的修改:

image

这种方式默认就会使用轮询的方式访问3个tomcat容器

用nginx1.conf作为配置启动nginx:

docker run --name myNginx -p 80:80 -v ~/docker/nginx1.conf:/etc/nginx/nginx.conf  -itd nginx

然后访问nginx服务器,发现会轮询地对3个tomcat容器进行访问:

image

image

image

image

使用shell脚本每隔一秒对nginx服务器访问的结果,可以更清楚地看到负载均衡的方式

while true; do wget -O - -q http://120.46.179.205;sleep 1; done

image

3.2 权重,三台服务器的权重为1,3,5

创建文件nginx2.conf,nginx2.conf在nginx1.conf基础上做了如下修改

image

即增加了权重处理,每个server被访问的频率与weight成正比

将nginx2.conf挂载到容器并启动nginx:

docker run --name myNginx -p 80:80 -v ~/docker/nginx2.conf:/etc/nginx/nginx.conf  -itd nginx

还是使用上面的脚本观察结果:

while true; do wget -O - -q http://120.46.179.205;sleep 1; done

可以看到三个tomcat1,tomcat2, tomcat3被访问的频率近似为1:3:5

image

3.3 IP Hash

IP Hash会按照IP进行访问,这样每个访客固定访问一个后端服务器,可以解决session问题

nginx3.conf在轮询(nginx1.conf)的基础上只要加上ip_hash就能实现IP hash访问:

image

nginx3.conf文件挂载到nginx容器中并启动nginx容器:

docker run --name myNginx -p 80:80 -v ~/docker/nginx3.conf:/etc/nginx/nginx.conf  -itd nginx

访问nginx服务器,无论怎么刷新都只会访问tomcat1

image

总结

通过这次实验,我学会了在云端用docker部署nginx和tomcat实现负载均衡的三种策略:轮询、权重和IP hash。熟悉了服务器,docker的操作和使用。

参考文档

posted @ 2022-05-27 18:38  沐灵_hh  阅读(1165)  评论(0编辑  收藏  举报