Nginx笔记(三)----Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

简介


这种方案,使用一个VIP地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备机在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案并不经济实惠。


一、网络拓扑

Nginx笔记(三)----Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群_第1张图片

四台虚拟机如下所示:

Nginx笔记(三)----Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群_第2张图片


为什么使用keepalived呢?

使用keepalived就用来做高可用的,提供虚拟VIP


二、软件安装

Nginx-Master和Nginx-Slave两台服务器上的安装操作完全一样

1、更新系统
[root@Nginx-Master ~]# yum -y update
2、安装依赖软件
[root@Nginx-Master ~]# yum install -y libnl*
[root@Nginx-Master ~]# yum -y install openssl openssl-devel kernel-devel        #可分别安装
[root@Nginx-Master ~]# yum -y install gcc gcc-c++ autoconf automake make  #可分别安装
[root@Nginx-Master ~]# yum install -y libnfnetlink-devel zlib zlib-devel gcc gcc-c++ openssl openssl-devel openssh 

说明:

pcre: 用来作地址重写的功能。
zlib:nginx 的gzip模块,传输数据打包,省流量(但消耗资源)。
openssl:提供ssl加密协议

安装 mailx 包,用于发送邮件 
[root@Nginx-Master ~]# yum -y install mailx
[root@Nginx-Master ~]# mailx -V
12.5 7/5/10
[root@Nginx-Master ~]# vim /etc/nail.rc
set [email protected](邮箱地址) 
set smtp=smtp.163.com(smtp服务器) 
set [email protected](用户名) 
set smtp-auth-password=xxxxxxxx(邮箱密码) 
set smtp-auth=login
测试
[root@Nginx-Master ~]echo 123 | mailx -v -s "test" [email protected]
[root@Nginx-Master ~]echo "hello world" | mail -s 'test666' [email protected]
或者
[root@Nginx-Master ~]mailx -v -s "test" [email protected]

3、安装keepalived和nginx

3.1.1、下载

[root@Nginx-Master ~]# cd /usr/local/src/
[root@Nginx-Master src]# wget http://nginx.org/download/nginx-1.9.7.tar.gz
[root@Nginx-Master src]# wget wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
3.1.2、解压
[root@Nginx-Master src]# tar -zvxf nginx-1.9.7.tar.gz 
[root@Nginx-Master src]# cd nginx-1.9.7
3.1.3、建立Nginx用户
[root@Nginx-Master nginx-1.9.7]# groupadd -g 1001 nginx  
[root@Nginx-Master nginx-1.9.7]# useradd -u 900 nginx -g nginx -s /sbin/nologin  
[root@Nginx-Master nginx-1.9.7]# tail -1 /etc/passwd  
nginx:x:900:1001::/home/nginx:/sbin/nologin  
3.1.4、安装Nginx 
[root@Nginx-Master nginx-1.9.7]#./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-http_ssl_module --with-http_gzip_static_module --user=nginx --group=nginx && make && make install
[root@Nginx-Master nginx-1.9.7]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/ 
3.1.5、安装keepalived
[root@Nginx-Master src]# tar -zvxf keepalived-1.3.5.tar.gz 
[root@Nginx-Master src]# cd keepalived-1.3.5
[root@Nginx-Master keepalived-1.3.5]# ./configure
Keepalived configuration
------------------------
Keepalived version       : 1.3.5
Compiler                 : gcc
Preprocessor flags       :  -I/usr/include/libnl3 
Compiler flags           : -Wall -Wunused -Wstrict-prototypes -Wextra -g -O2  
Linker flags             : 
Extra Lib                : -lcrypto -lssl -lnl-genl-3 -lnl-3
Use IPVS Framework       : Yes
IPVS use libnl           : Yes
IPVS syncd attributes    : No
IPVS 64 bit stats        : No
fwmark socket support    : Yes
Use VRRP Framework       : Yes
Use VRRP VMAC            : Yes
Use VRRP authentication  : Yes
With ip rules/routes     : Yes
SNMP vrrp support        : No
SNMP checker support     : No
SNMP RFCv2 support       : No
SNMP RFCv3 support       : No
DBUS support             : No
SHA1 support             : No
Use Debug flags          : No
Stacktrace support       : No
Memory alloc check       : No
libnl version            : 3
Use IPv4 devconf         : No
Use libiptc              : No
Use libipset             : No
init type                : systemd
Build genhash            : Yes
Build documentation      : No
[root@Nginx-Master keepalived-1.3.5]# make && make install
[root@Nginx-Master keepalived-1.3.5]# cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/init.d/keepalived
[root@Nginx-Master keepalived-1.3.5]# ll /etc/init.d/ | grep keepalived
-rwxr-xr-x  1 root root  1308 5月  28 16:01 keepalived
[root@Nginx-Master keepalived-1.3.5]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@Nginx-Master keepalived-1.3.5]# mkdir /etc/keepalived
[root@Nginx-Master keepalived-1.3.5]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@Nginx-Master keepalived-1.3.5]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
将nginx和keepalive服务加入开机启动服务
[root@Nginx-Master keepalived-1.3.5]# echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
[root@Nginx-Master keepalived-1.3.5]# echo "/etc/init.d/keepalived start" >> /etc/rc.local

三、配置机器

3.1、先关闭SElinux(master和slave两台负载均衡机都要做)

[root@Nginx-Master ~]# vim /etc/sysconfig/selinux
#SELINUX=enforcing                      #注释掉
#SELINUXTYPE=targeted                   #注释掉
SELINUX=disabled                        #增加
[root@Nginx-Master ~]# setenforce 0     #使配置立即生效
setenforce: SELinux is disabled
3.2、关闭防火墙

systemctl stop firewalld.service    #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
3.3、配置nginx

修改Nginx-Master的配置文件:
[root@Nginx-Master src]# vim /usr/local/nginx/conf/nginx.conf
**********************************************Nginx-Master配置文件*************************************

首先创建目录

[root@Nginx-Master ~]# mkdir /usr/local/webapps

修改nginx配置文件

[root@Nginx-Master ~]# vim /usr/local/nginx/conf/nginx.conf
user nobody;

worker_processes 2;

events{
		worker_connections 1024; 
}

http{
		#设置默认类型为二进制流
		default_type    application/octet-stream;

		server_names_hash_bucket_size   128;
		#指定来自client请求头的headerbuffer大小。设置为32KB
		client_header_buffer_size   32k;
		#指定client请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
		large_client_header_buffers 4 32k;
		#上传文件大小
		client_max_body_size 356m;
		#nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access
		log_format access '$remote_addr - $remote_user [$time_local] "$request" '
				'$status $body_bytes_sent "$http_referer" '
				'"$http_user_agent" "$http_x_forwarded_for"';
		#access日志存在未知
		access_log  /usr/local/nginx/logs/access.log    access;
		#开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络堵塞。

		sendfile    on;
		tcp_nopush  on;
		tcp_nodelay on;
		#设置client连接保持活动的超时时间
		keepalive_timeout   65;
		server_tokens   off;
		#client请求主体读取缓存
		client_body_buffer_size 512k;
		proxy_connect_timeout   5;
		proxy_send_timeout      60;
		proxy_read_timeout      5;
		proxy_buffer_size       16k;
		proxy_buffers           4 64k;
		proxy_busy_buffers_size 128k;
		proxy_temp_file_write_size 128k;

		#fastcgi_connect_timeout 300;
		#fastcgi_send_timeout   300;
		#fastcgi_read_timeout   300;
		#fastcgi_buffer_timeout 300;
		#fastcgi_buffers 4 64k;
		#fastcgi_busy_buffers_size 128k;
		#fastcgi_temp_file_write_size 128k;

		#开启gzip
		gzip    on;
		#同意压缩的最小字节数
		gzip_min_length 1k;
		#4个单位为16k的内存作为压缩结果流缓存
		gzip_buffers 4 16k;
		#设置识别HTTP协议版本号,默认是1.1
		gzip_http_version 1.1;
		#gzip压缩比,可在1~9中设置,1压缩比最小,速度最快。9压缩比最大。速度最慢,消耗CPU
		gzip_comp_level 2;
		#压缩的类型
		gzip_types text/plain application/x-javascript text/css application/xml;
		#让前端的缓存server混村经过的gzip压缩的页面
		gzip_vary   on;

		#Tomcat集群
		upstream mycluster{
				 server 192.168.182.112:8080 weight=1;
				 server 192.168.182.113:8080 weight=1;
		}

		server{
				listen 80;
				server_name 192.168.131.110;
				charset    utf-8; #设置编码为utf-8
				#root   html;

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

				#location ~ .*\.(jsp|do|action)$
				#location / {
				#			proxy_next_upstream http_502 http_504 error timeout invalid_header;
				#			proxy_pass http://mycluster;
				#			# 真实的clientIP
				#			proxy_set_header   X-Real-IP        $remote_addr; 
				#			# 请求头中Host信息
				#			proxy_set_header   Host             $host; 
				#			# 代理路由信息。此处取IP有安全隐患
				#			proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
				#			# 真实的用户訪问协议
				#			proxy_set_header   X-Forwarded-Proto $scheme;
				#}
				#静态文件交给nginx处理
				#location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
				#{
				#		root /usr/local/webapps;
				#		expires 30d;
				#}
				#静态文件交给nginx处理
				#location ~ .*\.(js|css)? $
				#{
				#		root /usr/local/webapps;
				#		expires 1h;
				#}
				error_page   500 502 503 504  /50x.html;  

				location = /50x.html {
					root   html;
				}

		}
}
**************************************************************Nginx-Slave配置文件**************************************
[root@Nginx-Slave ~]# mkdir /usr/local/webapps
[root@Nginx-Slave ~]# vim /usr/local/nginx/conf/nginx.conf
user nobody;

worker_processes 2;

events{
		worker_connections 1024; 
}

http{
		#设置默认类型为二进制流
		default_type    application/octet-stream;
		server_names_hash_bucket_size   128;
		#指定来自client请求头的headerbuffer大小,设置为32KB
		client_header_buffer_size   32k;
		#指定client请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
		large_client_header_buffers 4 32k;
		#上传文件大小
		client_max_body_size 356m;
		#nginx的HttpLog模块指定。指定nginx日志的输出格式,输出格式为access
		log_format access '$remote_addr - $remote_user [$time_local] "$request" '
				'$status $body_bytes_sent "$http_referer" '
				'"$http_user_agent" "$http_x_forwarded_for"';
		#access日志存在未知
		access_log  /usr/local/nginx/logs/access.log    access;
		#开启高效模式文件传输模式。将tcp_nopush和tcp_nodelay两个指另设置为on。用于防止网络堵塞。
		sendfile    on;
		tcp_nopush  on;
		tcp_nodelay on;
		#设置client连接保持活动的超时时间
		keepalive_timeout   65;
		server_tokens   off;
		#client请求主体读取缓存
		client_body_buffer_size 512k;
		proxy_connect_timeout   5;
		proxy_send_timeout      60;
		proxy_read_timeout      5;
		proxy_buffer_size       16k;
		proxy_buffers           4 64k;
		proxy_busy_buffers_size 128k;
		proxy_temp_file_write_size 128k;

		#fastcgi_connect_timeout 300;
		#fastcgi_send_timeout   300;
		#fastcgi_read_timeout   300;
		#fastcgi_buffer_timeout 300;
		#fastcgi_buffers 4 64k;
		#fastcgi_busy_buffers_size 128k;
		#fastcgi_temp_file_write_size 128k;

		#开启gzip
		gzip    on;
		#同意压缩的最小字节数
		gzip_min_length 1k;
		#4个单位为16k的内存作为压缩结果流缓存
		gzip_buffers 4 16k;
		#设置识别HTTP协议版本号。默认是1.1
		gzip_http_version 1.1;
		#gzip压缩比,可在1~9中设置。1压缩比最小。速度最快。9压缩比最大,速度最慢,消耗CPU
		gzip_comp_level 2;
		#压缩的类型
		gzip_types text/plain application/x-javascript text/css application/xml;
		#让前端的缓存server混村经过的gzip压缩的页面
		gzip_vary   on;

		upstream mycluster{
			 server 192.168.182.112:8080 weight=1;
			 server 192.168.182.113:8080 weight=1;
		 }

		server{
				listen 80;
				server_name 192.168.131.111;
				charset    utf-8; #设置编码为utf-8
				#root   html;

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

		#location ~ .*\.(jsp|do|action)$
		#location / {
		#		proxy_next_upstream http_502 http_504 error timeout invalid_header;
		#		proxy_pass http://mycluster;
		#		# 真实的clientIP
		#		proxy_set_header   X-Real-IP        $remote_addr; 
		#		# 请求头中Host信息
		#		proxy_set_header   Host             $host; 
		#		# 代理路由信息,此处取IP有安全隐患
		#		proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
		#		# 真实的用户訪问协议
		#		proxy_set_header   X-Forwarded-Proto $scheme;
		#}
		#静态文件交给nginx处理
		#location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
		#{
		#		root /usr/local/webapps;
		#		expires 30d;
		#}
		#静态文件交给nginx处理
		#location ~ .*\.(js|css)$
		#{
		#		root /usr/local/webapps;
		#		expires 1h;
		#}
		error_page   500 502 503 504  /50x.html;  

		location = /50x.html {
			root   html;
		}

		}
}
修改之后使用命令检查下是否有错误:
[root@Nginx-Master local]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

修改nginx的首页

[root@Nginx-Master ~]# vim /usr/local/nginx/html/index.html


  
  Welcome to Nginx-Master! 
   
  
  
  

Welcome to Nginx-Master!

Nginx-Master:192.168.182.110

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

[root@Nginx-Slave ~]# vim /usr/local/nginx/html/index.html


  
  Welcome to Nginx-Slave! 
   
  
  
  

Welcome to nginx Nginx-Slave!

Nginx-Slave:192.168.182.111

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

分别访问两个Nginx,http://192.168.182.110,http://192.168.182.111

Nginx笔记(三)----Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群_第3张图片

Nginx笔记(三)----Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群_第4张图片





3.4、keepalived配置

3.4.1、创建keepalived的pid目录

[root@Nginx-Master ~]# mkdir -p /usr/local/keepalived/var/run/
[root@Nginx-Master ~]# vi /usr/local/keepalived/var/run/keepalived.pid 

3.4.2、修改Nginx-Master负载机上的keepalived配置

[root@Nginx-Master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@Nginx-Master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

############################ 全局配置 #############################
  
global_defs {

    # 定义管理员邮件地址,表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,可以有多个,每行一个
	notification_email {    
        #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务	
		[email protected]
	}
    #keepalived在发生诸如切换操作时需要发送email通知地址,表示发送通知的邮件源地址是谁
	notification_email_from [email protected] 
	
	#指定发送email的smtp服务器
	smtp_server 127.0.0.1      
	
	#设置连接smtp server的超时时间
	smtp_connect_timeout 30    
	
	#运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
	router_id swarm01   
}


############################ VRRPD配置 #############################

# 定义chk_http_port脚本,脚本执行间隔10秒,权重-5,检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等
vrrp_script chk_http_port {  

    #这里通过脚本监测    
    script "/opt/chk_nginx.sh"   
	
	#脚本执行间隔,每2s检测一次
    interval 2    
	
    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5	
    weight -5     
	
    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)	
    fall 2     
	
    #检测1次成功就算成功。但不修改优先级	
    rise 1                    
}

#定义vrrp实例,VI_1 为虚拟路由的标示符,自己定义名称,keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管
vrrp_instance VI_1 { 

    #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,
	#但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,
	#那么他会就回抢占为MASTER   
    state MASTER 
	
	#指定HA监测网络的接口。与本机 IP 地址所在的网络接口相同,可通过ip addr 查看
    interface ens33      

    # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在哪个地址上发送VRRP通告,这个非常重要,
	#一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址    
    mcast_src_ip 192.168.182.110
	
	#虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
    virtual_router_id 51    

    #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级	
    priority 101 

    #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒	
    advert_int 1        

    #设置验证类型和密码。主从必须一样
    authentication {    
	
	    #设置vrrp验证类型,主要有PASS和AH两种
        auth_type PASS           
		
		#设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
        auth_pass 1111           
    }
	
	#VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
	#设置VIP,它随着state变化而增加删除,当state为master的时候就添加,当state为backup的时候则删除,由优先级决定
    virtual_ipaddress {          
        192.168.182.156
    }
    
	#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
	track_script {   

       #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。	
	   chk_http_port                    
	}
}

3.4.3、修改Nginx-Slave负载机上的keepalived配置

[root@Nginx-Slave ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@Nginx-Slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived    
  
global_defs {
	notification_email {                
		[email protected]
	}
	  
	notification_email_from [email protected]  
	smtp_server 127.0.0.1                    
	smtp_connect_timeout 30                 
	router_id swaram02                 
}
  
vrrp_script chk_http_port {         
	script "/opt/chk_nginx.sh"   
	interval 2                      
	weight -5                       
	fall 2                   
	rise 1                  
}
  
vrrp_instance VI_1 {            
	state BACKUP           
	interface ens33            
	mcast_src_ip 192.168.182.111
	virtual_router_id 51        
	priority 99               
	advert_int 1               
	authentication {            
		auth_type PASS         
		auth_pass 1111          
	}
	virtual_ipaddress {        
		192.168.182.156
	}
 
	track_script {                     
	   chk_http_port                 
	}

}

四、测试keepalived主从


4.1、让keepalived监控NginX的状态:

1)经过前面的配置,如果master主服务器的keepalived停止服务,slave从服务器会自动接管VIP对外服务;
一旦主服务器的keepalived恢复,会重新接管VIP。 但这并不是我们需要的,我们需要的是当NginX停止服务的时候能够自动切换。
2)keepalived支持配置监控脚本,我们可以通过脚本监控NginX的状态,如果状态不正常则进行一系列的操作,最终仍不能恢复NginX则杀掉keepalived,使得从服务器能够接管服务。

4.2、如何监控NginX的状态

最简单的做法是监控NginX进程,更靠谱的做法是检查NginX端口,最靠谱的做法是检查多个url能否获取到页面。

注意:这里要提示一下keepalived.conf中vrrp_script配置区的script一般有2种写法:

1)通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定。这是直接监控Nginx进程的方式。
2)脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP。这是检查NginX端口的方式。

上文script配置部分,"killall -0 nginx"属于第1种情况,"/opt/chk_nginx.sh" 属于第2种情况。个人更倾向于通过shell脚本判断,但有异常时exit 1,正常退出exit 0,然后keepalived根据动态调整的 vrrp_instance 优先级选举决定是否抢占VIP:

● 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
● 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
● 其他情况,原本配置的优先级不变,即配置文件中priority对应的值。

提示:
优先级不会不断的提高或者降低
可以编写多个检测脚本并为每个检测脚本设置不同的weight(在配置中列出就行)
不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况
在MASTER节点的 vrrp_instance 中 配置 nopreempt ,当它异常恢复后,即使它 prio 更高也不会抢占,这样可以避免正常情况下做无谓的切换,以上可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。

另外:在默认的keepalive.conf里面还有 virtual_server,real_server 这样的配置,我们这用不到,它是为lvs准备的。

4.3、如何尝试恢复服务

由于keepalived只检测本机和他机keepalived是否正常并实现VIP的漂移,而如果本机nginx出现故障不会则不会漂移VIP。
所以编写脚本来判断本机nginx是否正常,如果发现NginX不正常,重启之。等待3秒再次校验,仍然失败则不再尝试,关闭keepalived,其他主机此时会接管VIP;

根据上述策略很容易写出监控脚本。此脚本必须在keepalived服务运行的前提下才有效!如果在keepalived服务先关闭的情况下,那么nginx服务关闭后就不能实现自启动了。

该脚本检测ngnix的运行状态,并在nginx进程不存在时尝试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管。

监控脚本如下(master和slave都要有这个监控脚本):

[root@Nginx-Master ~]# vim /opt/chk_nginx.sh
[root@Nginx-Master ~]# chmod +x /opt/chk_nginx.sh
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/local/nginx/sbin/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        /etc/init.d/keepalived stop
    fi
fi

测试一:

关闭主服务器上的keepalived或nginx,vip是否会自动飘到从服务器上

1)先后在master、slave服务器上启动nginx和keepalived,保证这两个服务都正常开启:

[root@Nginx-Master ~]# /usr/local/nginx/sbin/nginx 
[root@Nginx-Master ~]# /etc/init.d/keepalived start
[root@Nginx-Master ~]# /usr/local/nginx/sbin/nginx 
[root@Nginx-Master ~]# /etc/init.d/keepalived start
如果在启动keepalived报如下的错:
5月 28 21:22:39 Nginx-Master systemd[1]: PID file /usr/local/keepalived/var/run/keepalived.pid  not readable (yet?) after start.
5月 28 21:24:09 Nginx-Master systemd[1]: keepalived.service start operation timed out. Terminating.
5月 28 21:24:09 Nginx-Master systemd[1]: Failed to start LVS and VRRP High Availability Monitor.
5月 28 21:24:09 Nginx-Master systemd[1]: Unit keepalived.service entered failed state.
5月 28 21:24:09 Nginx-Master systemd[1]: keepalived.service failed.
查看keepalived的进程
[root@Nginx-Master ~]# ps aux | grep keepalived
root      30898  0.0  0.0  48064  1040 ?        Ss   5月28   0:02 /usr/local/sbin/keepalived -D
root      30899  0.0  0.1  48064  1928 ?        S    5月28   0:02 /usr/local/sbin/keepalived -D
root      30900  0.0  0.0  48064  1544 ?        S    5月28   0:23 /usr/local/sbin/keepalived -D
root      76617  0.0  0.0 112720   988 pts/0    S+   09:49   0:00 grep --color=auto keepalived
然后将该进程写入到文件中
[root@Nginx-Master ~]# echo 30898 >> /usr/local/keepalived/var/run/keepalived.pid 

2)查看keepalived日志

[root@Nginx-Master ~]# tail -f /var/log/messages

3)在主服务器上查看是否已经绑定了虚拟IP

[root@Nginx-Master ~]# ip addr
ens33:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e0:69:a0 brd ff:ff:ff:ff:ff:ff
inet 192.168.182.110/24 brd 192.168.182.255 scope global noprefixroute ens33
   valid_lft forever preferred_lft forever
inet 192.168.182.156/32 scope global ens33
   valid_lft forever preferred_lft forever
inet6 fe80::3064:9b6a:9819:180a/64 scope link noprefixroute 
   valid_lft forever preferred_lft forever
会发现在ens33网卡上多出了一个ip地址192.168.182.156,分别访问三个地址:

192.168.182.110

Nginx笔记(三)----Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群_第5张图片

192.168.182.111

Nginx笔记(三)----Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群_第6张图片

192.168.182.156

Nginx笔记(三)----Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群_第7张图片

会发现vip的地址上成功的绑定到了master上去了。


4)关闭主服务器上的keepalived,vip会自动飘到从服务器上

先查看keepalived的状态是在运行中:

[root@Nginx-Master ~]# /etc/init.d/keepalived status
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since 二 2018-05-29 10:02:23 CST; 6min ago
  Process: 84372 ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 42685 (keepalived)
    Tasks: 3
   Memory: 968.0K
   CGroup: /system.slice/keepalived.service
           ├─42685 /usr/local/keepalived/sbin/keepalived -D
           ├─42686 /usr/local/keepalived/sbin/keepalived -D
           └─42687 /usr/local/keepalived/sbin/keepalived -D

5月 29 10:02:23 Nginx-Master systemd[1]: Starting LVS and VRRP High Availability Monitor...
5月 29 10:02:23 Nginx-Master Keepalived[84372]: Starting Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
5月 29 10:02:23 Nginx-Master systemd[1]: Started LVS and VRRP High Availability Monitor.

然后访问VIP: http://192.168.182.156显示的是Nginx-Master:192.168.182.110 这个nginx

Nginx笔记(三)----Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群_第8张图片

接下来停止主服务器上的keepalived,看从服务器的keepalived是否已经已经接管了VIP,访问: http://192.168.182.156/ 显示的是Nginx-Slave:192.168.182.111

Nginx笔记(三)----Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群_第9张图片



测试二:

接着验证下nginx服务故障,看看keepalived监控nginx状态的脚本是否正常?

手动关闭master机器上的nginx服务,最多2秒钟后就会自动起来(因为keepalive监控nginx状态的脚本执行间隔时间为2秒)

[root@Nginx-Master ~]# /usr/local/nginx/sbin/nginx -s stop
[root@Nginx-Master ~]# ps -ef|grep nginx
root 28401 24826 0 19:43 pts/1 00:00:00 grep --color=auto nginx
[root@Nginx-Master ~]# ps -ef|grep nginx
root 28871 28870 0 19:47 ? 00:00:00 /bin/sh /opt/chk_nginx.sh
root 28875 24826 0 19:47 pts/1 00:00:00 grep --color=auto nginx
[root@Nginx-Master ~]# ps -ef|grep nginx
root      99994  99993  0 11:17 ?        00:00:00 /bin/bash /opt/chk_nginx.sh
root      99999      1  0 11:17 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody   100001  99999  0 11:17 ?        00:00:00 nginx: worker process
nobody   100002  99999  0 11:17 ?        00:00:00 nginx: worker process
root     100005  93395  0 11:17 pts/0    00:00:00 grep --color=auto nginx

这种情况下是nginx挂掉了,会自动起来,keepalived挂掉了,会由Slave来接管。哪如果想要实现如下的效果:

1、当 keepalived 挂掉,那么理论上说 keepalived 服务会重新启动起来
2、当 nginx 挂掉后,那么理论上说 keepalived 服务也会关闭
3、当 keepalived 状态变为 Master 之后,发送邮件

4、当 nginx-1 配置改动之后,nginx-2 的配置也会相应的更改,并且 reload

可参看这篇文章:https://blog.csdn.net/wanglei_storage/article/details/51175418


五、搭建Tomcat集群

Tomcat集群只要去掉nginx.conf配置文件的以下注释就可以了:

		#location ~ .*\.(jsp|do|action)$
		#location / {
		#		proxy_next_upstream http_502 http_504 error timeout invalid_header;
		#		proxy_pass http://mycluster;
		#		# 真实的clientIP
		#		proxy_set_header   X-Real-IP        $remote_addr; 
		#		# 请求头中Host信息
		#		proxy_set_header   Host             $host; 
		#		# 代理路由信息,此处取IP有安全隐患
		#		proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
		#		# 真实的用户訪问协议
		#		proxy_set_header   X-Forwarded-Proto $scheme;
		#}
		#静态文件交给nginx处理
		#location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
		#{
		#		root /usr/local/webapps;
		#		expires 30d;
		#}
		#静态文件交给nginx处理
		#location ~ .*\.(js|css)$
		#{
		#		root /usr/local/webapps;
		#		expires 1h;
		#}

参考:

https://www.cnblogs.com/kevingrace/p/6138185.html

https://www.cnblogs.com/chimeiwangliang/p/7768438.html

https://www.cnblogs.com/jhcelue/p/7387665.html


你可能感兴趣的:(Nginx)