nginx+keepalived实现负载均衡及高可用

一、nginx的部署与安装(双机一致)

1、安装nginx

nginx一般需要先安装pcre,zlib,ssl,3个模块。

yum install openssl-devel pcre-devel zlib-devel

安装nginx

上传并解压nginx安装包:

tar -zxvf nginx-1.16.1.tar.gz

cd nginx-1.16.1

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module

make

make install

2、启动停止nginx

  • 启动

#检查配置

/usr/local/nginx/sbin/nginx -t

#启动

/usr/local/nginx/sbin/nginx

#重启

/usr/local/nginx/sbin/nginx -s reload

#关闭

/usr/local/nginx/sbin/nginx -s stop

 

 

 

 

 

 

 

Nginx负载均衡策略

  负载均衡用于从“upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求。一个最基本的upstream模块是这样的,模块内的server是服务器列表:

  这就是最基本的负载均衡实例,但这不足以满足实际需求;目前Nginx服务器的upstream模块支持6种方式的分配:

负载均衡策略
轮询 默认方式
weight 权重方式
ip_hash 依据ip分配方式
least_conn 最少连接方式
fair(第三方) 响应时间方式
url_hash(第三方) 依据URL分配方式

  关于nginx负载均衡策略详细内容查看 https://www.cnblogs.com/1214804270hacker/p/9325150.html

1、轮询

  最基本的配置方法,上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。

  有如下参数:

fail_timeout 与max_fails结合使用。
max_fails

设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了,

fail_time 服务器会被认为停机的时间长度,默认为10s。
backup 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
down 标记服务器永久停机了。

  注意:

  • 在轮询中,如果服务器down掉了,会自动剔除该服务器。
  • 缺省配置就是轮询策略。
  • 此策略适合服务器配置相当,无状态且短平快的服务使用。

2、weight

  权重方式,在轮询策略的基础上指定轮询的几率。例子如下:

    #动态服务器组
    upstream dynamic_zuoyu {
        server localhost:8080   weight=2;  #tomcat 7.0
        server localhost:8081;  #tomcat 8.0
        server localhost:8082   backup;  #tomcat 8.5
        server localhost:8083   max_fails=3 fail_timeout=20s;  #tomcat 9.0
    }

 

  在该例子中,weight参数用于指定轮询几率,weight的默认值为1,;weight的数值与访问比率成正比,比如Tomcat 7.0被访问的几率为其他服务器的两倍。

  注意:

  • 权重越高分配到需要处理的请求越多。
  • 此策略可以与least_conn和ip_hash结合使用。
  • 此策略比较适合服务器的硬件配置差别比较大的情况。

3、ip_hash

  指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。

#动态服务器组
    upstream dynamic_zuoyu {
        ip_hash;    #保证每个访客固定访问一个后端服务器
        server localhost:8080   weight=2;  #tomcat 7.0
        server localhost:8081;  #tomcat 8.0
        server localhost:8082;  #tomcat 8.5
        server localhost:8083   max_fails=3 fail_timeout=20s;  #tomcat 9.0
    }

  注意:

  • 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
  • ip_hash不能与backup同时使用。
  • 此策略适合有状态服务,比如session。
  • 当有服务器需要剔除,必须手动down掉。

 upstream qzauth {

        ip_hash; //ip_hash模式实现负载均衡

        server 172.24.2.53:8080;

        server 172.24.2.54:8080;

    }

    server {

        listen       8081;  //监听端口

        charset gbk;

        access_log  /var/log/nginx/host8081.access.log  main;

        proxy_set_header Host $host:$server_port;

    proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location /businessManager/ {

            proxy_pass http://qzauth/businessManager/;  //访问路径

        }

        location /authenticationService/ {

            proxy_pass http://qzauth/authenticationService/;

        }

 

 

 

 

 

 

 

 

 

 

 

二、nginx和keepalived实现高可用

VIP

IP

Nginx端口

默认主从

172.24.2.55

172.24.2.53

8081

MASTER

172.24.2.55

172.24.2.54

8081

BACKUP

1.keepalived上传到 opt目录下

 2.解压 安装  

 tar -zxvf keepalived-1.2.18.tar.gz
cd keepalived-1.2.18
./configure --prefix=/opt/keepalived
make && make install

3.将 keepalived 安装成 linux服务

  cp /opt/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
  cp /opt/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
 ln -s /opt/sbin/keepalived /usr/sbin/
  ln -s /opt/keepalived/sbin/keepalived /sbin/

 4.设置 keepalived 服务开机启动

 chkconfig keepalived on

5.修改 Keepalived 配置文件

vi /etc/keepalived/keepalived.conf 

 ! Configuration File for keepalived   (!、#都是注释)

  global_defs {  #全局配置
  notification_email {
  }
  notification_email_from [email protected]
  router_id LVS_01     #这个配置要唯一
  }

  vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
    interval 2 ## 检测时间间隔
    weight -20 ## 如果条件成立,权重-20
  }

  vrrp_instance VI_1 {   #实例  VI_1 名字可以随意  但是不建议修改
    state MASTER   # 主服务器 MASTER     从服务器 BACKUP
    interface ens192     #  ens192 网卡本地查看自己网卡名称
    virtual_router_id 51    # virtual_router_id  主备要一致
    priority 100  # 优先级  数字越大 优先级越高    priority 的值 主服务器要大于 从服务器
    advert_int 1  #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 
    authentication {   # 主从通信 验证类型及密码  
      auth_type PASS #设置vrrp验证类型,主要有PASS和AH两种
      auth_pass 1111 #设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
    }

    ## 将 track_script 块加入 instance 配置块
    track_script {
      chk_nginx ## 执行 Nginx 监控的服务
    }

    virtual_ipaddress { 
    172.24.2.55    #VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
    }
  }

 

 

6.编写 Nginx 状态检测脚本

vi /etc/keepalived/nginx_check.sh

  内容如下:自己看情况做修改,网上很多!

#!/bin/bash

  A=`ps -C nginx –no-header |wc -l`
  if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then

      killall keepalived
    fi
  fi

 

 

  保存后,给脚本赋执行权限:

 chmod +x /etc/keepalived/nginx_check.sh  

手动运行

sh /etc/keepalived/nginx_check.sh

这里是个坑,有错会绑定不了vip,一定要手动运行脚本没有出现报错。

 

7.注意点: Keepalived主从配置文件不同点

a.router_id  不一致

b.state  主服务器是 MASTER ,从服务器是  BACKUP

c.priority   主服务器 大于 从服务器

8.keepalived 命令

  启动 : service keepalived start

  停止: service keepalived stop

  重启: service keepalived restart

测试:IP add | grep 172.24.2.55

 

 

 

1、主机和从机都开启nginx和keepalived:vip在主机上

nginx+keepalived实现负载均衡及高可用

 

2、主机关闭nginx和keepalived,从机开启:

nginx+keepalived实现负载均衡及高可用

 

3、主机重新开启nginx和keepalived

vip重新切换到主机

 

nginx+keepalived实现负载均衡及高可用

 

遇到问题:

a.vip没绑定成功

    解决方案:

ip addr   查看  本地ip所在网卡的名称 ,然后修改 配置文件

 

nginx+keepalived实现负载均衡及高可用

vi /etc/keepalived/keepalived.conf  

nginx+keepalived实现负载均衡及高可用

 保存后   service keepalived restart  重启  keepalived服务即可

B.加入检测nginx脚本后无法绑定vip问题:检查测试脚本是否能够执行成功。