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的服务器
在申请后使用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
1.3 拉取nginx和tomcat镜像
docker pull nginx
docker pull tomcat
查看已经拉取到的镜像
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
查看已经创建的容器:
创建好的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
为了能够访问华为云服务器的8081,8082,8083端口,需要对服务器添加入口规则(80端口已经默认有了就不用添加了):
添加完成后就能访问tomcat了:
为了区分不同的tomcat容器,我们创建3个index.jsp文件,内容分别为this is tomcat1
,this is tomcat2
,this 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容器了:
3 nginx负载均衡
3.1 轮询方式
在本地目录创建容器中nginx.conf文件的副本nginx1.conf,修改后再挂载到容器中,下面是对nginx1.conf所做的修改:
这种方式默认就会使用轮询的方式访问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容器进行访问:
使用shell脚本每隔一秒对nginx服务器访问的结果,可以更清楚地看到负载均衡的方式
while true; do wget -O - -q http://120.46.179.205;sleep 1; done
3.2 权重,三台服务器的权重为1,3,5
创建文件nginx2.conf,nginx2.conf在nginx1.conf基础上做了如下修改
即增加了权重处理,每个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
3.3 IP Hash
IP Hash会按照IP进行访问,这样每个访客固定访问一个后端服务器,可以解决session问题
nginx3.conf
在轮询(nginx1.conf
)的基础上只要加上ip_hash
就能实现IP hash访问:
将nginx3.conf
文件挂载到nginx容器中并启动nginx容器:
docker run --name myNginx -p 80:80 -v ~/docker/nginx3.conf:/etc/nginx/nginx.conf -itd nginx
访问nginx服务器,无论怎么刷新都只会访问tomcat1
总结
通过这次实验,我学会了在云端用docker部署nginx和tomcat实现负载均衡的三种策略:轮询、权重和IP hash。熟悉了服务器,docker的操作和使用。