nginx+keepalived 双主热备负载均衡

nginx+keepalived 双主热备负载均衡
前端

     负载均衡技术对于一个网站尤为是大型网站的web服务器集群来讲是相当重要的!作好负载均衡架构,能够实现故障转移和高可用环境,避免单点故障,保证网站健康持续运行。不少企业的网络架构都须要用到nginx+keepalived的负载均衡技术,此时能够用到两种模式,分别是主从模式和双主模式,这两种模式的主要区别是:主从模式其中的一台备用机是长时间处于空闲状态的,而双主模式的两台调度器都是一块儿工做,这样能合理利用资源以及分担在一台前端nginx服务器上的压力。nginx

    实现的过程主要仍是分为两个过程:web

        1、前端两台nginx作反向代理到后面两台web服务器vim

        2、对前端两台nginx作keepalived(心跳检测)   后端

          基本配置缓存

         前端nginx fjw133:192.168.10.133 vip1:192.168.10.200(主) 192.168.10.200(备)bash

         前端nginx fjw134:192.168.10.134 vip1:192.168.10.200(主) 192.168.10.220(备)服务器

         后端web服务器 fjw132:192.168.10.132 网络

         后端web服务器 fjw135:192.168.10.135架构

981cae41b903cfa893d38332b990c891.jpg-wh_

1、先配置前端nginx反向代理

        在fjw133上安装nginx

       一、wget nginx安装包

          cd /usr/local/nginx

          wget http://nginx.org/download/nginx-1.13.6.tar.gz

       二、建立nginx用户

          useradd nginx -s /sbin/nologin -M

       三、解压

           tar -zxvf nginx-1.13.6.tar.gz

           cd nginx-1.13.6

        四、编译

            ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre

             make && make install

        五、检测配置文件

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

             /usr/local/nginx/sbin/nginx -s start

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

            /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

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

         六、修改配置文件

              vim /usr/local/nginx/conf/nginx.conf  

#运行用户
#user  nobody;
#启动进程,一般设置成和cpu的数量相等
worker_processes  1;
#全局错误日志及PID文件
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
error_log  /usr/local/nginx/logs/error.log notice;
pid        /usr/local/nginx/logs/nginx.pid;
events {
#单个后台worker process进程的最大并发连接数 
    worker_connections  1024;
}
http {
##设定mime类型,类型由mime.type文件定义
    include       mime.types;
#默认文件类型
    default_type  application/octet-stream;
#设定日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
#开启高效文件传输模式
    sendfile        on;
#如下两个选项用于防止网络阻塞
    tcp_nopush     on;
#长连接超时时间
    keepalive_timeout  65;
#打开gzip压缩
    gzip  on;
upstream backend {
 server 192.168.10.132:80 max_fails=3 fail_timeout=30s;#代理的web服务
 server 192.168.10.135:80 max_fails=3 fail_timeout=30s;#最大失败3次直接踢掉,超过30秒踢掉
               }
server {
        listen    80;                 #监听端口
        server_name  localhost   
#charset koi8-r;
##access_log  logs/host.access.log  main;
location / {
proxy_pass http://backend;    ##对应上面upstream定义的backend
proxy_store off;        ##启用本地缓存功能
proxy_redirect off;   ##指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
##定义或添加字段传递给代理服务器的请求头。
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
}
}

           七、检测配置文件并从新加载服务

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

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

           一样的步骤去配置fjw134,配置文件也相同,就再也不演示

           八、而后配置后端两台web服务器

              我用的也是nginx作web服务器,安装过程和上面同样,只须要发布网站就能够,也不详细演示

           九、接着能够作keepalived的部分,安装keepalived

                    yum install -y keepalived  

           十、修改配置文件

                    vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   notification_email {               #故障发生时给谁发邮件
     root@localhost
   }
   notification_email_from root@fjw133      #通知邮件从哪一个地址发出
   smtp_server localhost
   smtp_connect_timeout 30             #链接smtp服务器的超时时间
   router_id  hostname               #上面都是发邮件的部分,这里就不演示
}
vrrp_script chk_http_port {
   script "/test/check_nginx.sh"
   interval 2
   weight -5
   fall 2
   rise 1
}
vrrp_instance VI_1 {
    state MASTER             #另外一台的状态是BACKUP
    interface ens33
    virtual_router_id 51         #另外一台的id要保持同样
    priority 100             ##权重必须比BACKUP高
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.200
    }
track_script {
   chk_nginx
}
}
vrrp_instance VI_2 {
    state BACKUP              #另外一台的状态是MASTER
    interface ens33
    virtual_router_id 52          #与另外一台的id要保持同样
    priority 99              #权重必须比master低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.220
    }
track_script {
   chk_http_port
 }
}

           十一、fjw134也一样要装keepalived,其配置文件是      

! Configuration File for keepalived
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server localhost
   smtp_connect_timeout 30
   router_id  NodeA
}
vrrp_script chk_nginx {                   ##这个部分定义nginx反向代理服务的检测脚本
script "/test/nginx_check.sh"                  ##脚本路径
interval 2                                    ##检测周期
weight -2                                     ##若是脚本被执行,那么优先级将会下降2
fall 2                                        ##指监控几回判断为失败
rise 1                                        ##指监控几回判断为成功
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.200
    }
track_script {
   chk_nginx
}
}
vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.220
    }
track_script {
   chk_nginx
}
}

             十二、/test/check_nginx.sh是检测nginx的脚本,若是nginx服务忽然down,脚本会自动重启nginx,若是起不了就关掉keepalived,这样服务就转到另外一台前端nginx

           

 vim /test/check_nginx.sh
#!/bin/sh
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ] ; then
   /usr/local/nginx/sbin/nginx
   sleep 2
   A=`ps -C nginx --no-header | wc -l`
   if [ $A -eq 0 ] ; then
   systemctl stop keepalived
   fi
fi

          1三、此时能够查看两个vip,已经分别分配到两台前端nginx上

[root@fjw133 ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:0a:17:8a brd ff:ff:ff:ff:ff:ff

    inet 192.168.10.133/24 brd 192.168.10.255 scope global ens33

       valid_lft forever preferred_lft forever

    inet 192.168.10.200/32 scope global ens33

       valid_lft forever preferred_lft forever

    inet6 fe80::9c2e:cd7b:fea:3bf9/64 scope link

[root@fjw134 ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:95:72:dc brd ff:ff:ff:ff:ff:ff

    inet 192.168.10.134/24 brd 192.168.10.255 scope global ens33

       valid_lft forever preferred_lft forever

    inet 192.168.10.220/32 scope global ens33

       valid_lft forever preferred_lft forever

    inet6 fe80::46e:7225:ebf3:f9ca/64 scope link 

       valid_lft forever preferred_lft forever

    inet6 fe80::538f:f55f:2ea8:6dd9/64 scope link tentative dadfailed 

       valid_lft forever preferred_lft forever

    inet6 fe80::9c2e:cd7b:fea:3bf9/64 scope link tentative dadfailed 

       valid_lft forever preferred_lft forever

               1四、测试关闭fjw133的nginx服务,但服务仍是会自动起来  ,fjw134也是同样             

[root@fjw133 ~]# /usr/local/nginx/sbin/nginx -s stop

[root@fjw133 ~]# netstat -ntpl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13847/nginx: master 

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      878/sshd     

              1五、关闭fjw133的keepalived,VIP1会跳到fjw134上

[root@fjw133 ~]# systemctl stop keepalived

[root@fjw134 ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:95:72:dc brd ff:ff:ff:ff:ff:ff

    inet 192.168.10.134/24 brd 192.168.10.255 scope global ens33

       valid_lft forever preferred_lft forever

    inet 192.168.10.220/32 scope global ens33

       valid_lft forever preferred_lft forever

    inet 192.168.10.200/32 scope global ens33

       valid_lft forever preferred_lft forever

                 1六、即便一台前端nginx关掉了,访问两个VIP仍是能够轮询访问两个web服务器发布的网页

64e5f5568cd20a15cd1a8e7d314c7e50.png-wh_

相关文章
相关标签/搜索