nginx高可用

为什么要使用nginx的高可用:因为nginx作为反向代理服务器时,有可能出现宕机的情况,而由于其反向代理的特性,就会导致其他服务器(tomcat等)无法被访问,这样项目就停止工作了。但是使用了高可用后,就可以避免这种现象出现。

什么是高可用:nginx的高可用简单来说就是配置了两台(或更多)的nginx服务器,当主服务器宕机时,就会自动切换到备用服务器,从而保证项目的持续运行。

高可用的原理:nginx的实现需要借助其他工具(keepalived)来实现。在keepalived中配置一个虚拟IP(VIP),同时keepalived会定时检查主服务器的工作状态(通过脚本实现)。在主服务器正常工作时,VIP就会映射到主服务器的IP,此时,虚拟ip对应的物理地址和主服务器IP对应的物理地址是相同的,所以访问虚拟IP即访问主服务器。当主服务器失效时,脚本就会监测到,从而根据预先的配置,找到优先级最高的备用服务器,并将虚拟IP映射到该备用服务器的ip,此时,这两个ip对应的物理地址时相同的。再主服务器回复正常时,又会被检测到,又会自动切换到主服务器。这样就实现了nginx的高可用。

一个nginx高可用实现的简单案例(Docker)

一、需求准备清单

  • 两台虚拟机

  • Nginx-MASTER(主服务器):安装在一台虚拟机的docker中。IP:192.168.1.117

  • Nginx-BACKUP(备用服务器):安装在另一台虚拟机docker中。IP:192.168.1.150

  • keepalived:虚拟IP设置:192.168.11.11

二、相关软件安装、配置

**虚拟机:**虚拟机安装这里不做展示,可自行查询资料(要求能连外网,相关:

Nginx安装:

  1. 首先需要安装docker容器,( docker相关 ):

    #将yum更新到最新yum update#安装需要的软件包yum install -y yum-utils device-mapper-persistent-data lvm2#设置yum源yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo#安装dockeryum install -y docker-ce#查看docker版本,检验是否成功docker -v#systemctl start docker(管理员权限)systemctl start docker#开机启动docker服务systemctl enable docker
  2. 下载nginx镜像

    #搜索镜像docker search nginx#拉取镜像,默认最新docker pull nginx
  3. 创建nginx容器

    首先:需要准备nginx中的配置文件(docker中有两个nginx.conf、default.conf),因为docker中的文件不能直接修改,需要挂载数据卷,这里直接从nginx容器中复制过来

    #创建配置文件存放位置,存放在/root/nginx/mkdir ~/nginxmkdir ~/nginx/conf.dmkdir ~/nginx/html#切换目录cd ~/nginx/#创建未挂载数据卷的nginx容器,只为要其中的配置文件docker run -id --name=nginx nginx#复制其中的文件docker cp nginx:/etc/nginx/nginx.conf ./docker cp nginx:/etc/nginx/conf.d/default.conf ./conf.d/

    准备好配置文件后,即可创建正式的nginx容器

    #创建容器,并映射端口docker run --name=nginx-MASTER -d -p 8000:80 -v $PWD/html:/usr/share/nginx/html -v $PWD/nginx.conf:/etc/nginx/nginx.conf:ro -v $PWD/conf.d:/etc/nginx/conf.d nginx

    再使用上面的命令在另一个虚拟机中实现注意将--name=nginx-MASTER改为nginx-BACKUP 理论上不该也行,为了好区分,注意开启端口8000

    此时可以分别在浏览器使用虚拟机的ip 8000访问nginx,出现欢迎界面即为安装成功。

    更多nginx相关配置信息见:

  4. 安装keepalived软件

    keepalived软件安装在linux本地,而不是安装在docker中

    #使用yum命令安装keepalived yum install keepalived -y #检查是否安装完成 rpm -q -a keepalived

    安装位置:/etc/keepalived/keepalived.conf,后面主要修改该配置文件

  5. 修改keepalived.conf配置文件,添加注释的为重点,其他不关键

    打开配置文件

    vi /etc/keepalived/keepalived.conf

    Nginx-MASTER(主服务器)配置:

    global_defs {   notification_email { abc@qq.com       }   notification_email_from root@qq.com       smtp_server 182.168.1.117       smtp_connect_timeout 30   router_id 127.0.0.1     #127.0.0.1}vrrp_script chk_nginx {script "/etc/keepalived/nginx_pid.sh"   # 检查nginx状态的脚本    interval 2      #检查时间间隔    weight 3    #权重}vrrp_instance VI_1 {state MASTER     #备份服务器上将MASTER改为BACKUP    interface ens33   #网卡名称    virtual_router_id 66   #主备机virtual_router_id必须一致    priority 100       #备份服务上将100改为小于100,可配置成90    advert_int 1    authentication {auth_type PASS        auth_pass 1111    }    virtual_ipaddress {192.168.11.11    #有多个vip可在下面继续增加    }    track_script {chk_nginx    }}

    Nginx-BACKUP(备用服务器):

    global_defs {   notification_email { 1826467987@qq.com   }   notification_email_from root@xuad.com   smtp_server 182.168.1.117   smtp_connect_timeout 30   router_id 127.0.0.1   #127.0.0.1}vrrp_script chk_nginx {script "/etc/keepalived/nginx_pid.sh"   # 检查nginx状态的脚本    interval 2    weight 3}vrrp_instance VI_1 {state BACKUP     #备份服务器上将MASTER改为BACKUP    interface ens33    virtual_router_id 66   #与master一致    priority 90       #备份服务上将100改为小于100,可配置成90    advert_int 1    authentication {auth_type PASS        auth_pass 1111    }    virtual_ipaddress {192.168.11.11    #有多个vip可在下面继续增加    }    track_script {chk_nginx    }}
  6. 添加脚本信息

    在上面的配置文件中有一行:script “/etc/keepalived/nginx_pid.sh” 即脚本位置

    #转到该目录cd /etc/keepalived/#创建文件touch nginx_pid.sh#编辑文件vi nginx_pid.sh

    脚本内容:

    #!/bin/bashA=`ps -C nginx --no-header |wc -l`if [ $A -eq 0 ];then     systemctl restart docker    #重启docker容器      sleep 3            if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then            #如果重启失败,关闭keepalived                  systemctl stop keepalivedfifi

    两个虚拟机中都要添加

  7. 完成以上配置后分别重启两个虚拟机中的nginx和keepalived

    #重启nginxdocker stop nginx-MASTERdocker start nginx-MASTER#开启keepalivedsystemctl start keepalvied.service
  8. 测试,使用虚拟IP访问:http://192.168.11.11:8000,即可看到nginx欢迎界面,当关闭主nginx时:

    docker stop nginx-MASTERsystemctl stop keepalvied.service

    该访问url依然可以访问,表示高可用实现

关于url:这里需要添加端口,因为nginx是在docker容器中,在上面也可以看到,80端口映射了宿主机的8000端口,所以要添加端口;由此推导,两个nginx的映射端口也必须一致,否则无论如何只能访问其中一个nginx

(0)

相关推荐