实验成功:Nginx反向代理,负载均衡,redis session共享,keepalived高可用

一、资源准备

  • nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换。
  • tomcat服务器两台,由nginx进行反向代理和负载均衡,此处可搭建服务器集群。
  • redis服务器一台,用于session的存储和共享。

  • nginx主服务器:192.168.8.146
  • nginx备服务器:192.168.8.161
  • tomcat项目服务器1:192.168.8.163
  • tomcat项目服务器2:192.168.8.166
  • redis服务器:192.168.8.171

二、通用配置

安装操作系统

总的需要模拟五台服务器,使用vmware,全部使用centos7 64位,五台服务器全部安装jdk1.8,安装linux命令行工具,上传文件工具,此处使用SecureCRT,SecureFX,putty。操作系统安装步骤请参考安装CentOS-7-x86_64
在这里插入图片描述

安装JDK1.8

下载Linux x64 8u202 解压缩版,这个版本是oracle在jdk1.8收费前的最后一个版本。
jdk1.8下载地址
(1)先把jdk压缩文件,传到服务器上,我上传到了/usr/下
(2)解压缩

tar -xvzf jdk-8u202-linux-x64.tar.gz

(3)配置jdk环境变量
编辑/etc/profile,在文件末尾添加以下变量:

vi /etc/profile
export JAVA_HOME=/usr/jdk1.8.0_202
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH

(4)使jdk环境变量生效

source /etc/profile

(5)查看jdk版本

java -version

java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
[root@nginx1 nginx]#

防火墙配置

nginx主服务器,nginx备服务器需开通80端口
tomcat项目服务器1,tomcat项目服务器2需开通8080端口
redis服务器需开通6379端口

(1)查看已开放端口

firewall-cmd --list-all

(2)防火墙开放端口

firewall-cmd --zone=public --add-port=8080/tcp --permanent

(3)开放端口后需重载防火墙

firewall-cmd --reload

三、Nginx反向代理与负载均衡

架构图

在这里插入图片描述

此时需要用到三台服务器,一台nginx服务器,两台正式部署项目的服务器。
选择的是192.168.8.146主nginx和192.168.8.163,192.168.8.166两台tomcat服务器

部署tomcat

首先在两台服务器上安装tomcat:我这里使用的是apache-tomcat-7.0.104,tomcat7下载地址。这个也是简单,不多说,上传解压即可使用,bin目录下 startup.sh启动,shutdown.sh关闭,这两个文件需要授权。

chmod a+x startup.sh
chmod a+x shutdown.sh

启动tomcat访问:192.168.8.163:8080192.168.8.166:8080,打开tomcat首页即成功。

准备测试项目

编写测试项目test,并将test上传至tomcat的webapps目录下,测试项目文件夹中只包含一个index.jsp文件,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.net.InetAddress"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>nginx演示</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
</head>
<% 
	String serverIp=InetAddress.getLocalHost().getHostAddress();
	String serverInfo=application.getServerInfo();
	Properties props=System.getProperties(); //获得系统属性集    
	String osName = props.getProperty("os.name"); //操作系统名称    
	String osArch = props.getProperty("os.arch"); //操作系统构架    
	String osVersion = props.getProperty("os.version"); //操作系统版本 
%>
<body>
<h2>sessionId:<%=session.getId() %></h2>
<h2>服务器ip:<%=serverIp %></h2>
<h2>tomcat服务器信息:<%=serverInfo %></h2>
<h2>服务器操作系统名称 :<%=osName %></h2>
<h2>服务器操作系统构架 :<%=osArch %></h2>
<h2>服务器操作系统版本 :<%=osVersion %></h2>
</body>
</html>

tomcat配置

修改tomcat的server.xml文件

  • Engine标签中添加jvmRoute,用于标识nginx访问的是哪个服务器tomcat,163服务器标识为163Server1,166服务器标识为166Server2。
    在这里插入图片描述
  • Host标签中添加:<Context path="" docBase="test"/>,path标识访问路径,docBase为项目名,表示访问项目。
    在这里插入图片描述
    此时,重新启动tomcat,访问192.168.8.163:8080192.168.8.166:8080,显示index.jsp内容:两台服务器访问显示如下:
    在这里插入图片描述
    在这里插入图片描述

安装Nginx

在nginx主机192.168.8.146上安装nginx,我这里使用的是nginx-1.19.5,nginx下载地址
先使用yum命令安装gccpcrezlibopenssl

yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

将nginx-1.19.5.tar.gz上传至nginx服务器的/usr目录下,解压:

tar -zxvf nginx-1.8.0.tar.gz

进入解压后目录,依次执行命令

./configure

make

make install

至此nginx安装完毕,安装目录是/usr/local/nginx,nginx默认占用80端口

nginx相关命令

./sbin/nginx			#启动
./sbin/nginx -s stop	#停止
./sbin/nginx -s reload	#重新启动

启动nginx后访问192.168.58.146即可访问nginx:显示nginx欢迎页。
在这里插入图片描述
至此,nginx安装完毕。nginx备服务器 192.168.8.161 按照同样的方法进行安装。

反向代理与负载均衡配置

现有两台服务器,一台为192.168.8.163,一台为192.168.8.166,服务器上各有一个tomcat,端口均为8080,在192.168.8.146上有nginx,经过配置nginx,当访问192.168.8.146:80时,即可访问192.168.8.163:8080,192.168.8.166:8080中随机一台,此时192.168.8.146:80被nginx监听,当有请求时,代理到192.168.8.163:8080,192.168.8.166:8080随机一台,即为nginx 反向代理 功能。同时此时可以通过nginx将请求进行转发,保证了一个入口,将所有请求转发到两台服务器上也减轻了任何一台的负载压力,当有大量请求时,可以搭建大量服务器,在入口代理服务器上使用nginx进行转发,即是 负载均衡 功能。
在这里插入图片描述
配置即是配置nginx安装目录中conf目录下的nginx.conf文件即可:具体配置如下,重点是红色部分。

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    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  0;
    keepalive_timeout  65;

    #gzip  on;

    #配置被代理的服务器
    upstream blank {
        #ip_hash;
        server 192.168.8.163:8080;
        server 192.168.8.166:8080;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
		#这里配置代理是指上面定义的两个被代理目标,blank名字必须一致
                proxy_pass http://blank;
                
                #proxy_redirect          off;
                #如果是非80端口,配置为Host $host:端口号,目的是将代理服务器收到的用户的信息传到真实服务器上
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
                client_body_buffer_size 128k;
                proxy_connect_timeout   300;
                proxy_send_timeout      300;
                proxy_read_timeout      300;
                proxy_buffer_size       4k;
                proxy_buffers           4 32k;
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;
                add_header Access-Control-Allow-Origin *;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

启动两台tomcat,重新启动nginx:

访问192.168.8.146:80将会随机访问192.168.8.163:8080和192.168.8.166:8080其中一台。(问题:每次刷新nginx服务器地址sessionid会变,session不能共享。)
在这里插入图片描述
在这里插入图片描述
nginx轮询策略
nginx负载均衡到多台服务器上时,默认采用轮询策略:

常见策略:
1、轮询
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况,数字越大命中率越高。
例如:轮询几率是2:1

upstream bakend {
	server 192.168.8.163:8080 weight=2;
	server 192.168.8.166:8080 weight=1;
}

3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。例如:

upstream bakend {
	ip_hash;
	server 192.168.8.163:8080;
	server 192.168.8.166:8080;
}

其他策略可以自行查询学习,nginx还有很多其他可配置项,静态资源缓存,重定向等,想深入的童鞋请自行学习。

nginx配置详解:http://blog.csdn.net/tjcyjd/article/details/50695922

四、session共享问题

由于nginx是随机分配请求,假设一个用户登录时访问网站登录时被分配到192.168.8.163:8080上,然后进行了登录操作,此时该服务器上就会有该用户登录的session信息,然后登录后重定向到网站首页或个人中心时,此时如果被分配到192.168.8.166:8080上,那么这台服务器上没有该用户session信息,于是又会变成未登录状态,所以由于nginx的负载均衡会导致session共享的问题。

解决方法:
1、nginx提供了ip_hash策略,可以保持用户ip进行hash值计算固定分配到某台服务器上,然后只要是该ip则会保持分配到该服务器上,保证用户访问的是同一台服务器,那么session问题就不存在了。这也是解决session共享的一种方式,也称为黏性session。但是假设一台tomcat服务器挂了的话,那么session也会丢失。所以比较好的方案是抽取session。

2、session存在memcache或者redis中,以这种方式来同步session,把session抽取出来,放到内存级数据库里面,解决了session共享问题,同时读取速度也是非常之快。
在这里插入图片描述

Redis搭建

在redis服务器192.168.8.171上搭建redis,redis默认端口为6379

redis依赖gcc,先安装:

yum install -y gcc-c++

(1)下载redis,我这里使用的是redis-6.0.9.tar.gz,上传至linux /usr/中
(2)解压缩

tar -xvzf redis-6.0.9.tar.gz

(3)进入解压后目录redis-6.0.9,执行make命令进行编译,安装到目录/usr/local/redis

make PREFIX=/usr/local/redis install

执行该命令时,可能会遇到如下的错误:
在这里插入图片描述
一般是gcc没有安装或者gcc的版本问题,Linux默认的4.8.5的,安装升级就好。

## 查看gcc版本
gcc -v 

## 升级gcc版本,依次执行已下命令升级gcc
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

gcc升级之后,远程工具要重新打开,不然看到的gcc版本不会变,redis也安装不成功。重新打开后,先清除之前的编译内容,要再执行一次编译安装。

## 清除编译垃圾
make distclean
## 编译安装
make PREFIX=/usr/local/redis install

安装完成之后将redis配置文件拷贝到安装目录下,redis.conf是redis的配置文件,redis.conf在redis源码目录,port默认6379。
执行:

cp /usr/redis-6.0.9/redis.conf /usr/local/redis/

在redis安装目录启动和关闭redis:

  • 启动redis:
./bin/redis-server ./redis.conf

在这里插入图片描述
这种启动方式叫做前端启动,必须保持在当前窗口,如果ctrl + c 退出,那么redis也就退出了,不建议使用

那么后端启动:
首先修改redis.conf中daemonize的值,打开可以看到默认是no,修改为daemonize yes,启动即可。
如果要远程不限主机IP访问redis,请注释掉bind 127.0.0.1,修改protected-mode yes改为protected-mode no 关闭redis保护模式
也可以在该配置文件中修改redis默认端口6379为其他值。

  • 关闭redis:
./bin/redis-cli shutdown

至此,redis服务器搭建完成。

tomcat与redis集成实现session共享

环境为tomcat7 + jdk1.8的话:
在所有需要共享session的服务器的tomcat的lib目录中添加以下三个jar包,注意版本最好一致,不然极容易出现错误,下边的测试是可用的:
commons-pool-1.5.5.jar
jedis-2.0.0.jar
tomcat-redis-session-manager-1.2-tomcat-7.jar

tomcat-redis-session-manager-1.2-tomcat-7.jar可以从https://github.com/jcoleman/tomcat-redis-session-manager进行源码下载打包,其它两个jar文件可以从C:\Users\weitao\.gradle\caches\modules-2\files-2.1目录下进行查找。

tomcat的conf目录中content.xml中加入:配置redis服务

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve"/>
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
	host="192.168.8.171"
	port="6379"
	database="0"
	maxInactiveInterval="60" />

启动redis服务,重新启动所有tomcat,启动nginx,刷新nginx页面,两台tomcat页面可以看到sessionid值不变,关闭某台tomcat,nginx中sessionid不变,说明session是共享的。

五、keepalived高可用

架构图

在这里插入图片描述
上面已经是搭好了nginx主服务器这条线的,那么同理,使用nginx备机192.168.8.161上再搭建nginx,也是代理192.168.8.163和192.168.8.166两台服务器。配置与nginx主服务器一样,这里不再赘述。

那么现在就是相当于有两套nginx了,代理的服务器是一样的,为什么要搞两套?
假设只有一台nginx的话,这个nginx服务器挂了。那怎么办?
所以需要一台备份nginx。
正常情况下,主nginx作为反向代理服务器即可,假设nginx服务器挂了的话,能够立即切换到备份机上,保证用户可以访问,然后运维人员把主nginx服务器故障修好之后,又能够自动切换到主nginx提供服务。通过keepalived来监测两台服务器,正常情况时,将nginx主服务器ip(192.168.8.146)绑定到keepalived定义的一个虚拟ip(我设置为192.168.8.110)上,通过这个虚拟IP可以访问nginx,然后备机(192.168.8.161)啥事不干,主机就是每隔一小段时间(设置为1秒)keepalived会告诉备机,你不用管,我还活着呢,如果突然主机死了,那么就会超过一秒备机没有收到主机或者的消息,那么备机马上接管主机,keeplived将虚拟ip绑定到备机身上,网站继续提供服务。

突然主机又复活了(运维人员排除故障了),那么备机又将收到主机的活着的消息,于是将管理权交回给主机,虚拟ip又绑到主机上,大概就是这么个过程。
在这里插入图片描述

keepalived安装

我这里直接使用yum云直接安装了。

yum install -y keepalived

keepalived配置

安装完毕后再/etc/keepalived/目录下有个文件 keepalived.conf即是本台服务器keepalived的核心配置文件了:

重点:keepalived配置,配置文件上边部分按照下面的配置就行了,配置文件后面的内容可以不用管,我这里没用的配置全部都删除了。

先配置主机192.168.8.146的keepalived,按下边进行配置:

! Configuration File for keepalived
 
#这是全局配置
global_defs {
   #运行keepalived机器的一个标识
   router_id LVS_DEVEL
}
 
#主备配置
vrrp_instance VI_1 {
    #标示状态为MASTER 备份机为BACKUP
    state MASTER
    #设置keepalived实例绑定的服务器网卡,一般为eth0,linux使用ifconfig命令可查看当前服务器网卡标识名
    interface ens33
    #同一实例下(即同一组主备机下)virtual_router_id必须相同
    virtual_router_id 51
    #MASTER权重要高于BACKUP,MASTER为100则BACKUP最大为99
    priority 100
    #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒,设置为1秒
    advert_int 1
    #设置认证
    authentication {
        #主从服务器验证方式,PASS为明文密码验证
        auth_type PASS
        #密码
        auth_pass 1111
    }
    #设置虚拟IP,与我们的主备机在同一网段下,最后一位随便给就是拉,可以设置多个,换行即可
    virtual_ipaddress {
        192.168.8.110
    }
}

再配置备机192.168.8.161的keepalived,按下边进行配置:

! Configuration File for keepalived
 
#这是全局配置
global_defs {
   #运行keepalived机器的一个标识
   router_id LVS_DEVEL
}
 
#主备配置
vrrp_instance VI_1 {
    #标示状态为MASTER 备份机为BACKUP
    state BACKUP
    #设置keepalived实例绑定的服务器网卡,一般为eth0,linux使用ifconfig命令可查看当前服务器网卡标识名
    interface ens33
    #同一实例下(即同一组主备机下)virtual_router_id必须相同
    virtual_router_id 51
    #MASTER权重要高于BACKUP,MASTER为100则BACKUP最大为99
    priority 99
    #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒,设置为1秒
    advert_int 1
    #设置认证
    authentication {
        #主从服务器验证方式,PASS为明文密码验证
        auth_type PASS
        #密码
        auth_pass 1111
    }
    #设置虚拟IP,绑定的虚拟ip与主机一致
    virtual_ipaddress {
        192.168.8.110
    }
}

需要修改state为BACKUP,priority比MASTER低,virtual_router_id的值必须保持一致
keepalived就配置完成了

keeplived启动关闭命令

service keepalived start		## 启动
service keepalived stop			## 停止
service keepalived restart		## 重启

结果验证

(1)启动两台nginx,启动主机keepalived,启动备机keepalived服务。
这时,nginx主机在提供服务,备机是闲着的,虚拟ip是192.168.8.110,在主机和备机上使用命令ip addr可以发现:
主机:192.168.8.146 带有虚拟ip192.168.8.8.110,在浏览器中输入192.168.8.110,即可访问到主nginx 192.168.8.146,然后转发到tomcat服务器上。
在这里插入图片描述
浏览器访问虚拟ip:192.168.8.110,效果如下
在这里插入图片描述
以上是初始状态下的情况,也是正常服务的情况。

(2)测试高可用
假设主机nginx服务器挂了,模拟为关闭nginx主机或者将keepalived服务停止,那么主机上keepalived死了就没办法告诉备机自己活着,而备机超过1秒没有接收到主机给自己的消息,马上接管虚拟ip,同时在配置文件中配置切换主备机时发送邮件,此时开发团队收到邮件即知道主机挂了,马上去排除主机的故障。

将主机上的keepalived服务停止,service keepalived stop ,然后查看虚拟ip绑定情况,
主机挂了:可以看到虚拟ip就没有绑在主机上
在这里插入图片描述
备机情况:虚拟ip已经绑定到备机,此时主机虽然挂了,但是切换到备机上了(发现故障和切换的时间差最大也就是1秒),虚拟ip也绑到备机上了,访问虚拟ip,就会请求备机nginx然后转发到web服务器实现高可用。
在这里插入图片描述
运维人员收到邮件后就去排除主机故障了,搞定之后(模拟为keepalived服务启动),这时主机告诉备机,我又活了,于是备机将管理权又交给主机(切换为主机nginx提供服务):

主机keepalived服务启动后,即把主机维护好之后:可以看到,虚拟ip又自动绑到了主机上
在这里插入图片描述
备机情况,主机活了之后,备机转交管理权,虚拟ip切换到主机上,备机不再绑定虚拟ip
在这里插入图片描述
这就是keepalived高可用的模拟。

注意问题:
主机挂了之后,主机nginx恢复时,一定要将nginx也启动,否则即使虚拟ip切换到了主机上,但是主机nginx没起那也是没法转发的。所以要把nginx启动要加在开机启动中。

六、Nginx服务开机自启动

如果用yum install命令安装的,yum命令会自动创建nginx.service文件,直接用命令:
systemcel enable nginx.service设置开机启动即可。

我是用源码编译安装的,所以要手动创建nginx.service服务文件。
开机没有登录情况下就能运行的程序,存在系统服务(system)里,即:
/lib/systemd/system/
(1)在系统服务目录里创建nginx.service文件
vi /lib/systemd/system/nginx.service
nginx.service内容如下:

[Unit]
Description=nginx
After=network.target
 
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

说明:

Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3

保存退出。

(2)设置开机启动

systemctl enable nginx.service

自此,重新centos后,nginx就自动启动了

(3)nginx其他命令

systemctl start nginx.service (启动nginx服务)
systemctl stop nginx.service (停止nginx服务)
systemctl enable nginx.service (设置开机自启动)
systemctl disable nginx.service (停止开机自启动)
systemctl status nginx.service (查看服务当前状态)
systemctl restart nginx.service (重新启动服务)
systemctl list-units --type=service (查看所有已启动的服务)

七、解决nginx进程和keepalived不同时存在问题

keepalived是通过检测keepalived进程是否存在判断服务器是否宕机,如果keepalived进程在,但是nginx进程不在了,那么keepalived是不会做主备切换。因为是nginx挂了,然后无法做代理,keepalived还在不会切换到备机。

所以要一直检测nginx是否还在,如果不在,那么让keepalived也停止,同生共死。

注:只需要在主机上搞就行了,备机没必要检测nginx,因为基本是主机在服务。

解决:写个脚本来监控nginx进程是否存在,如果nginx不存在就将keepalived进程杀掉。

注:keepalived不需要开机启动,假如开机自启的话,如果keepalived比nginx 更快启动的话,脚本检测nginx还没启动会把keepalived停掉的,所以没必要,只需要nginx开机启动,启动主机后自行手动的把keepalived服务启动即可。

在主nginx上编写nginx进程检测脚本(check_nginx.sh),在keepalived配置文件目录下创建脚本:

vi /etc/keepalived/check_nginx.sh

脚本文件内容如下:

#!/bin/bash
# 如果进程中没有nginx则将keepalived进程kill掉
A=`ps -C nginx --no-header |wc -l`      ## 查看是否有 nginx进程 把值赋给变量A
if [ $A -eq 0 ];then                    ## 如果没有进程值得为 零
       service keepalived stop          ## 则结束 keepalived 进程
fi

给权限:

chmod a+x /etc/keepalived/check_nginx.sh

先测试一下脚本:
把nginx停了,此时keepalived还在运行,所以不会切换,虚拟ip无法访问到web服务器。
在这里插入图片描述
然后执行脚本:
主机脚本检测nginx不在了,把keepalived停掉,从输出可以看到确实停止了,主机虚拟没有绑定虚拟ip。
在这里插入图片描述
备机:成功绑定虚拟ip
在这里插入图片描述
所以,只需要让该脚本一直执行,即一直检测nginx进程是否在,如果不存在了,那么直接停止主机keepalived,切换备机,保证能够访问web服务器。

按如下修改keepalived配置文件keepalived.conf,添加脚本定义检测:

只需要在正确的位置添加红色部分即可:那么脚本则是两秒执行一次,一旦发现主机nginx不在了,keepalived停止,切换备机。

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        check_nginx
    }

    virtual_ipaddress {
        192.168.8.110
    }
}

保存后,重新启动主机keepalived服务即可。

测试:
回到负载均衡高可用的初始状态,保证主、备上的keepalived、nginx全部启动。
停止主nginx服务:
主机查看keepalived进程,发现没有,说明已经停止了,虚拟ip也没有绑在主机上
在这里插入图片描述
备机:绑定虚拟ip,切换成功。
在这里插入图片描述

测试通过,如果主机nginx挂了之后,keepalived也会随着挂掉,然后切换备机,至此本测试已经圆满结束。

八、下一步工作

单机redis部署太不安全,所有session都要经过该redis服务,并发量大,如果该redis宕机,整个系统玩完,非常的不安全。下一步工作是将redis进行集群式部署,来提高整个系统的容错能力。

九、资料查阅

感谢博主MrLinFeng提供的资料,大部分实验的内容, 都是基于该博主的文章进行的,也感谢其他博主提供的问题解决方案。

  1. Nginx反向代理,负载均衡,redis session共享,keepalived高可用
  2. yum安装的keepalived 使用systemctl无法停掉其后台进程
  3. keepalived出现主备机同时绑定vip的解决方法
  4. Keepalived监测脚本一直不执行

十、未解决的问题

上面部署Tomcat时,为了方便分辨访问的是哪个服务器,在Tomcat的server.xml的Engine节点,服务器1配置了jvmRoute=“163Server1”,服务器2配置了jvmRoute=“166Server2”
在这里插入图片描述
但是在连redis进行session共享后,再访问192.168.8.146,会一直往redis里插session,session是这样排列的
2861F6822A395EF5B9C52A73BD00FE82.166Server2.166Server2
2861F6822A395EF5B9C52A73BD00FE82.166Server2.166Server2.166Server2
2861F6822A395EF5B9C52A73BD00FE82.166Server2.166Server2.166Server2.166Server2

每次增加1个。
直到redis不堪重负,自己关闭连接,不能访问。所以我用redis进行session共享时,是把jvmRoute这个配置给删掉了。为什么加了jvmRoute后,会出现这样的情况,有知道的大神,可以在文章评论区指导一二。

错误截图
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值