• 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的操作和使用。

    参考文档

  • 相关阅读:
    tcpprep 对IPV6的支持
    the server quit without updating pid file (/var/lib/mysql/localhost.localdomain.pid)
    servlet service() for servlet jsp throws null pointer exception
    tomcat开机启动
    mysql 允许远程访问
    spring的helloworld
    java中的那些坑
    关于struts2中的相对路径与绝对路径
    Powercenter Source Filter
    oracle删除当前用户的表
  • 原文地址:https://www.cnblogs.com/huihao/p/16318746.html
Copyright © 2020-2023  润新知