zoukankan      html  css  js  c++  java
  • 搭建 docker + nginx + keepalived 实现Web应用的高可用(亲测)

     1. 环境准备

          下载 VMware : https://www.vmware.com/go/getplayer-win

           下载 Centos : https://mirrors.aliyun.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso

           下载之后安装好 VMware,然后创建两个 centos 虚拟机,具体安装步骤直接按照界面提示操作即可,装完操作系统之后重启即可。

           主机IP:192.168.65.132  备机IP 192.168.65.129  将两台机器都安装好 docker ,nginx,keepalived 安装方法如下面。

     2. 安装启动 docker

           yum -y install docker #参数 y 代表自动选择,可以试一下不加 y 会是什么效果 

           问题:如果是首次使用这个命令,会报错 cannot find a valid baseurl for repo : base/7/x86_64。

           解决:1.打开 vi /etc/sysconfig/network-scripts/ifcfg-ens33(每个机子都可能不一样,但格式会是“ifcfg-ens数字”),把ONBOOT=no,改为ONBOOT=yes

                2.重启网络  service network restart

           问题: 如何校验是否安装成功 

          解决: 使用命令 docker -v ,会提示所安装的 docker 的版本信息

           问题: 如何设置 docker 为开机自启以及后台启动

           解决: 1.开机自启         systemctl enable docker

                 2.启动 docker    systemctl start docker

                 3.检查是否启动    systemctl start docker

     3. 安装启动 nginx 

            1.镜像加速:  https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors    (这里可能需要注册一个阿里云的账号,用大佬的东西,注册个账号也不费事)

            

            2.拉取镜像:docker pull nginx   #这里获取的是最新的 nginx

            3.显示已拉取的镜像: docker images

            

           4.创建文件夹用于使用自己定义的配置文件以及日志文件

              mkdir -p /app/docker/nginx/conf  # 配置文件

              mkdir -p /app/docker/nginx/html   #主页

              mkdir -p /app/docker/nginx/logs   #日志存放

           5.在 /app/docker/nginx/conf 目录下创建配置文件: vi nginx.conf

    nginx.conf

             在 /app/docker/nginx/html 目录下创建首页(仅仅是后面用来判断请求落在了哪个机器上,主机和备机能区分开就行): vi  index.html  

    Master machine IP: 192.168.65.132
    index.html

            在 /app/docker/nginx/ 目录下创建 docker 启动文件: vi start.sh     

    #!/bin/bash
    docker run --name docker-nginx --privileged=true --restart=always -p 80:80 
        -v /app/soft/docker-config/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 
        -v /app/soft/docker-config/nginx/logs:/var/log/nginx 
        -v /app/soft/docker-config/nginx/html:/usr/share/nginx/html 
        -d nginx   
        
    # --privileged=true    使用此参数 container内的root拥有真正的root权限
    # --restart=always     docker启动时,自动重启该容器                   
    # -p 80:80             将容器的80端口映射到主机的80端口                
    # --name docker-nginx  容器的名字  
    # -v /app/soft/docker-config/nginx/conf/nginx.conf:/etc/nginx/nginx.conf  # 挂载文件夹,将主机的文件夹挂载到容器的文件夹  
    # -v /app/soft/docker-config/nginx/logs:/var/log/nginx 
    # -v /app/soft/docker-config/nginx/html:/usr/share/nginx/html 
    # -d nginx   下载的容器的名字,不带版本号就是最新的 
    start.sh

          6.启动 nginx  ./start.sh    (先执行 chmod +x start.sh 使得脚本可以执行)

            

         7.分别访问两个IP地址 

           主机:

                    

           备机:

        

       8.查看日志进入 cd /app/docker/nginx/logs

    5. 安装 keepalived 

          1.yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel

           2.yum install -y keepalived

           3.修改配置文件 /etc/keepalived/keepalived.conf 

           主机和备机的配置文件在于:state 和 priority 两个地方,修改下这里就行,主机初始状态为 MASTER,优先级为100 备机初始状态为BACKUP,优先级为80

    ! Configuration File for keepalived
    
    global_defs { # 全局配置
       notification_email {
         123@qq.com # 接受告警的邮箱
       }
       notification_email_from sample@163.com # 指定发件人
       smtp_server 192.168.200.1 # 指定的 smtp服务器地址
       smtp_connect_timeout 30   # 指定 smtp 连接超时时间
       router_id LVS_DEVEL       # 负载均衡标识,在局域网应该是唯一的
       vrrp_skip_check_adv_addr  
       vrrp_strict               #添加一个周期性执行的脚本。脚本的退出状态码会被调用它的所有的VRRP Instance记录。
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }
    
    vrrp_script chk_nginx { 
        script "/etc/keepalived/nginx_check.sh" #  指定要执行的脚本的路径 
        interval 5 # 指定脚本执行的间隔。单位是秒。默认为1s。
    }
    
    vrrp_instance VI_1 {
        state MASTER    # 指定该keepalived节点的初始状态 这里这个并不意味着他就是主机!!是根据下面比较 priority 值来判断主机的
        interface ens33 # vrrp实例绑定的接口,用于发送VRRP包 这里需要写成 ifconfig 显示的网卡名
        virtual_router_id 51 # 指定VRRP实例ID,范围是0-255
        priority 100 # 指定优先级,优先级高的将成为MASTER
        advert_int 1 # 指定发送VRRP通告的间隔。单位是秒
        authentication {
            auth_type PASS # 指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)
            auth_pass 1111 # 指定认证所使用的密码。最多8位
        }
        virtual_ipaddress {
            192.168.65.135 # 指定VIP地址
        }
        track_script {
            chk_nginx
        }
    }
    View Code

          4.创建定时检测 nginx 是否正常运行的脚本  (执行 chmod +x nginx_check.sh 使得脚本可以执行)

    #!/bin/bash
    A=`ps -C nginx --no-header |wc -l`
     if [ $A -eq 0 ];then
          # /usr/bin/docker rstart docker-nginx  >> ./tmp/echo.log 2>> ./tmp/echo2.log  #正常情况下这里需要重启 nginx,这里已疯,环境变量导致着无法识别命名
          sleep 3
                if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
                            ps -ef|grep keepalived|grep -v grep|awk '{print $2}'|xargs kill -9
                fi
    fi
    nginx_check.sh

           大坑:这里是定时去调用这个脚本去检测 nginx 有没有正常运行,但是由于 crontab 的环境变量问题!脚本手动执行是可以执行的,但是运行就会报 "命令找不到",或者 "没有权限",由于水平有限,研究了两天还不知道怎么搞。附带几个链接,试过了但是还是没有解决,后续等解决之后修改,请大佬指点。

            Linux中crontab的坑爹环境变量问题

            corantab 不能自动执行的一些问题-环境变量

            crontab定时任务自动不能执行,手动可以执行的解决办法-亲测解决

         5.启动 keepalived 

          systemctl enable keepalived # 开机自启动

           systemctl start keepalived     # 启动

           systemctl stop keepalived     # 暂停

           systemctl restart keepalived  # 重启

           systemctl status keepalived   # 查看状态  

        6.查看日志

          tail -f /var/log/messages

    6. 验证

        第一种情况:两个机器 nginx 都正常运行

          1.访问 http://192.168.65.132/  页面会显示   "Master machine..... IP:192.168.65.132" 

           2.访问 http://192.168.65.129/  页面会显示   "Slave machine ... IP:192.168.65.129" 

           3.访问 http://192.168.65.135/  页面会显示   "Master machine..... IP:192.168.65.132"   说明现在 主机192.168.65.132 获得 VIP 

           4.通过 cat /app/docker/logs/access.log 查看到访问记录,日志的格式也是配置文件中定义的

        第二种情况 : 主机 nginx 关闭

          1.关闭主机 docker : docker stop docker-nginx  (docker-nginx 是在 .start.sh 定义的容器的名称)

            2.由于 keepalived 定时监控 nginx 运行状态,发现 nginx 关闭了,此时会将 keepalived 关闭,备机获得 VIP ,在关闭主机docker时,可以观察备机的日志,tail -f /var/log/messages

            

            3.此时访问  http://192.168.65.135/  页面提示:  “Slave machine ... IP:192.168.65.129”

          4.查看备机 192.168.65.129 的 cat /app/docker/logs/access.log 能查看到访问记录

        第三种情况:主机 nginx 关闭之后重启

          1.重启主机 docker : docker restart docker-nginx  (docker-nginx 是在 .start.sh 定义的容器的名称)

            2.重启已关闭的 keepalived : systemctl restart keepalived 

            3.观察主机和备机的日志 : tail -f /var/log/messages

              主机:

                  

           备机:

               

             5.会发现主机马上获取到了 VIP,此时再访问 http://192.168.65.135/  页面会显示   "Master machine..... IP:192.168.65.132"

    7. 结束

      参考博客 : https://blog.51cto.com/andyxu/2286045

                  https://blog.csdn.net/jomexiaotao/article/details/83271458

     

      水平有限,如有错误的地方,希望大家可以友情指出 你我共同进步,开开心心的就好

     

    -- 整理于网络,加上自己的理解,大家一起学习,进步就好
  • 相关阅读:
    QtDBus快速入门
    论Qt容器与STL
    JS中的!=、== 、!==、===的用法和区别
    JS操作JSON总结
    select2使用方法总结
    Entity Framework插入数据报错:Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
    Windows登录类型及安全日志解析
    <script type="text/html"></script> js模版使用
    在 C# 中,(int) ,Int32.Parse() 和 Convert.toInt32() 三种方法的区别
    关于session,cookie,Cache
  • 原文地址:https://www.cnblogs.com/shulipeng/p/10688450.html
Copyright © 2011-2022 走看看