Nginx反向代理+Keepalived实现Nginx高可用

3 篇文章 0 订阅
1 篇文章 0 订阅

先来解释一个三个概念:

  1. 集群的种类:

    负载均衡(Load Balance)集群,简称LB:
    硬件的实现: – F5 负载均衡器
    软件的实现: – LVS(4层,传输层) – Nginx(7层,应用层)

    高可用(High Availability)集群,简称 HA 集群
    高性能计算(High Perfermance Computing)集群,简称 HPC 集群

  2. LVS集群–LVS(Linux Virtual Server)

    LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一,是根据iptables的实现来开发的,所以使用时候会和iptables相当类似
    官网:http://www.linuxvirtualserver.org/
    中文站点: http://zh.linuxvirtualserver.org/

    LVS提供了三种包转发方式:NAT(网络地址映射)、IP Tunneling(IP隧道)、Direct Routing(直接路由)。不同的转发模式决定了不同的cluster的网络结构
    LVS 集群工作结构图:
    在这里插入图片描述

  3. Keepalived概述:
    keepalived 是一个类似于 layer3, 4 & 5 交换机制的软件,也就是我们平时说的第 3 层、第 4 层和第 5层交换。 Keepalived 的作用是检测 web 服务器的状态,如果有一台 web 服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的 web 服务器从系统中剔除,当 web 服务器工作正常后 Keepalived 自动将web 服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web 服务器。

    具体可参考链接:OSI七层模型与TCP/IP五层模型
    在这里插入图片描述

拓展一下Keepalived工作原理:

Layer3,4&5 工作在 IP/TCP 协议栈的 IP 层, TCP 层,及应用层,。
Layer3: Keepalived 使用 Layer3 的方式工作式时, Keepalived 会定期向服务器群中的服务器发送一个 ICMP 的数据包(既我们平时用的 Ping 程序) , 如果发现某台服务的 IP 地址没有激活,Keepalived 便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。 Layer3 的方式是以服务器的 IP 地址是否有效作为服务器工作正常与否的标准。
Layer4: 主要以 TCP 端口的状态来决定服务器工作正常与否。如 web server 的服务端口一般是80,如果 Keepalived 检测到 80 端口没有启动,则 Keepalived 将把这台服务器从服务器群中删除。
Layer5: Layer5 就是工作在具体的应用层了,比 Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。 Keepalived 将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则 Keepalived 将把服务器从服务器群中剔除。

Keepalived的作用与构建:

  1. 管理 VIP,VIP 会在 LVS 之间漂移

  2. 监控 LVS分发器:

    运行在主分发的 Keepalived 会以组播的形式向网络中宣告自己,即主分发器还活着,备用节点能收到。当备用节点,在一个时间单位中收不到组播,备用节点会认为主 LVS 挂了,开始接手主分发器工作,把 VIP 配给自己。

  3. 管理 RS

    Keepalived 会每隔一个时间段去做一次类似于访问的操作如:
    探针: elinks http://192.168.3.64 –dump
    经典高可用web架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选)
    http://www.keepalived.org/

    下载:http://www.keepalived.org/download.html

  4. Nginx在应用层做负载均衡转发请求

网络拓扑图:

在这里插入图片描述

环境准备以及规划:

  • Client IP: 192.168.88.133
  • VIP:192.168.88.140
  • Nginx负载均衡IP1,Keepalived MASTER节点:192.168.88.130
  • Nginx负载均衡IP2,Keepalived BACKUP节点:192.168.88.131
  • Web站点1:192.168.88.129
  • Web站点1:192.168.88.130

安装Nginx,实现负载均衡,反向代理

  1. 安装Nginx部署可参考:
    https://blog.csdn.net/qq_24333367/article/details/107757760

  2. Nginx反向代理配置部分如下:
    在配置文件nginx.conf的最后一行}前,添加以下内容:
    upstream ecstest {
    server 192.168.88.129:80;
    server 192.168.88.130:80;
    }
    在server段里面的location加上proxy_pass http://ip:端口;:
    proxy_pass http://ecstest;

    [root@cs02 conf]# grep -v "#" nginx.conf
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        client_max_body_size 0m;
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       80;
            server_name  localhost;
            location / {
                root   html;
                index  index.html index.htm;
                proxy_pass http://ecstest;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
        upstream ecstest {
            server 192.168.88.129:80;
            server 192.168.88.130:80;
        }
    }
    [root@cs02 conf]#
    
  3. 访问Nginx 负载均衡IP,查看是否进行轮询转发:

    [root@client ~]# curl http://192.168.88.131
    Test Server:192.168.88.129 Static Server
    [root@client ~]# curl http://192.168.88.131
    Test Server:192.168.88.130 Static Server
    [root@client ~]# curl http://192.168.88.131
    Test Server:192.168.88.129 Static Server
    [root@client ~]# curl http://192.168.88.131
    Test Server:192.168.88.130 Static Server
    [root@client ~]#
    

安装Keepalived:

1. 使用yum 进行安装
yum install keepalived -y
2. 配置keepalived.conf,设置MASTER/BACKUP(主备)

MASTER配置:

[root@cs02 conf]# cat /etc/keepalived/keepalived.conf
	vrrp_script check_nginx_pid {
	    script "/etc/keepalived/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
	    interval 2                          #(检测脚本执行的间隔,单位是秒)
	}
	#vrrp 实例定义部分
	vrrp_instance VI_1 {
	    state MASTER            # 指定keepalived的角色,MASTER为主,BACKUP为备
	    interface ens34         # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
	    virtual_router_id 66    # 虚拟路由编号,主从要一直
	    priority 100            # 优先级,数值越大,获取处理请求的优先级越高
	    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
	    #授权访问
	    authentication {
	        auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
	        auth_pass 1111
	    }
	    track_script {
	        check_nginx_pid            #(调用检测脚本)
	    }
	    virtual_ipaddress {
	            192.168.88.140            # 定义虚拟ip(VIP),可多设,每行一个
	    }
	}
	[root@cs02 conf]#

BACKUP配置

	[root@cs03 keepalived]# cat keepalived.conf
	vrrp_script check_nginx_pid {
	    script "/etc/keepalived/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
	    interval 2                          #(检测脚本执行的间隔,单位是秒)
	}
	#vrrp 实例定义部分
	vrrp_instance VI_1 {
	    state BACKUP            # 指定keepalived的角色,MASTER为主,BACKUP为备
	    interface ens34         # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
	    virtual_router_id 66    # 虚拟路由编号,主从要一直
	    priority 90            # 优先级,数值越大,获取处理请求的优先级越高
	    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
	    #授权访问
	    authentication {
	        auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
	        auth_pass 1111
	    }
	    track_script {
	        check_nginx_pid            #(调用检测脚本)
	    }
	    virtual_ipaddress {
	            192.168.88.140            # 定义虚拟ip(VIP),可多设,每行一个
	    }
	}
  1. 编写Nginx检查脚本,给脚本赋执行权限:

    [root@cs02 keepalived]# cat check_nginx_pid.sh
    	#!/bin/bash
    	A=`ps -C nginx --no-header |wc -l`
    	if [ $A -eq 0 ];then
    	         echo "nginx down ######## no nginx" >> /var/log/messages
    	         /usr/local/nginx/sbin/nginx
    	          pkill keepalived
    	fi
    [root@cs02 keepalived]# chmod +x check_nginx_pid.sh
    [root@cs02 keepalived]# ll
    总用量 20
    -rwxr-xr-x. 1 root root  194 8月   4 19:22 check_nginx_pid.sh
    -rw-r--r--. 1 root root 1111 8月   4 17:30 keepalived.conf
    -rw-r--r--. 1 root root  951 8月   4 12:19 keepalived.conf.0804
    -rw-r--r--. 1 root root 1159 8月   4 17:00 keepalived.conf.1604
    -rw-r--r--. 1 root root 3598 8月   4 10:24 keepalived.conf.bak
    [root@cs02 keepalived]#
    

    4.启动Nginx,Keepalived 测试VIP是否正常提供服务:

    启动Keepalived ,查看是否启动成功: 在这里插入图片描述

    查看VIP是否绑定在ens34网卡上:
    在这里插入图片描述

    查询Linux系统日志发现Keepalived MASTER已工作:

    [root@cs02 keepalived]# tail -f /var/log/messages
    

    在这里插入图片描述
    用curl 发起请求,看VIP是否已经正常工作:

    [root@client ~]# curl http://192.168.88.140
    Test Server:192.168.88.129 Static Server
    [root@client ~]# curl http://192.168.88.140
    Test Server:192.168.88.130 Static Server
    [root@client ~]# curl http://192.168.88.140
    Test Server:192.168.88.129 Static Server
    [root@client ~]# curl http://192.168.88.140
    Test Server:192.168.88.130 Static Server
    [root@client ~]#
    

    5.停掉MASTER节点的Nginx,测试VIP是否漂移

    [root@cs02 keepalived]# /usr/local/nginx/sbin/nginx -s stop
    [root@cs02 keepalived]#
    

    MASTER节点的系统日志/var/log/messages:
    在这里插入图片描述

    BACKUP节点的系统日志/var/log/messages:
    在这里插入图片描述
    测试VIP漂移时访问是否有影响在这里插入图片描述

    6.恢复MASTER节点的Nginx,测试VIP是否回到MASTER :

    [root@cs02 keepalived]# ./check_nginx_pid.sh
    	[root@cs02 keepalived]# systemctl restart keepalived
    	[root@cs02 keepalived]#
    

    BACKUP节点的系统日志/var/log/messages:
    在这里插入图片描述
    MASTER节点的系统日志/var/log/messages:
    在这里插入图片描述
    VIP漂移时访问情况:
    在这里插入图片描述
    查看VIP是否在BACKUP节点上:
    在这里插入图片描述

踩坑总结:

  1. 重启keepalived 不生效,报错Can’t open PID file /var/run/keepalived.pid (yet?) after start: No such file or directory
  2. VIP访问不漂移:

解决办法,kill掉keepalived存在的服务,重启keepalived服务:

[root@cs02 keepalived]# ps -ef|grep keepalived
root      14910  14259  0 17:05 pts/2    00:00:00 grep --color=auto keepalived
[root@cs02 keepalived]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

8月 04 17:01:48 cs02 systemd[1]: Starting LVS and VRRP High Availability Monitor...
8月 04 17:01:48 cs02 systemd[1]: Can't open PID file /var/run/keepalived.pid (yet?) after start: No such file or directory
8月 04 17:01:48 cs02 systemd[1]: Started LVS and VRRP High Availability Monitor.
8月 04 17:05:38 cs02 Keepalived[3007]: Stopping
8月 04 17:05:38 cs02 Keepalived_healthcheckers[3008]: Removing service [192.168.88.132]:80 from VS [192.168.88.140]:80
8月 04 17:05:38 cs02 Keepalived_healthcheckers[3008]: Stopped
8月 04 17:05:38 cs02 Keepalived_vrrp[3009]: VRRP_Instance(cs1) sent 0 priority
8月 04 17:05:38 cs02 Keepalived_vrrp[3009]: VRRP_Instance(cs1) removing protocol VIPs.
8月 04 17:05:39 cs02 Keepalived_vrrp[3009]: Stopped
8月 04 17:05:39 cs02 Keepalived[3007]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
[root@cs02 keepalived]# pkill keepalived
[root@cs02 keepalived]# ps -ef|grep keepalived
root      14910  14259  0 17:05 pts/2    00:00:00 grep --color=auto keepalived
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值