首页 > 代码库 > nginx和keepalived实现nginx高可用
nginx和keepalived实现nginx高可用
首先介绍一下Keepalived,它是一个高性能的服务器高可用或热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实现web服务端的高可用。
Keepalived以VRRP协议为实现基础,用VRRP协议来实现高可用性(HA).VRRP (Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),如下图所示:
这张图的意思是,我们使用keepalived来管理两台设备的Nginx,并虚拟出一个IP,我们现在两台装有Nginx的设备分别是192.168.156.11和192.168.156.12,那么我们可以虚拟出一个192.168.156.xx的IP,外界请求直接访问虚拟IP而不是真正的Nginx,让虚拟IP去访问提供服务的Nginx(注意:高可用是指同一时间提供服务的只有一台设备,提供服务的设备挂掉之后,备份服务器便开始提供服务),然后再由Nginx去访问tomcat。
下面我们在192.168.156.11和192.168.156.12两台设备上都安装下keepalived。
1、两台设备都进入到/usr/local/software目录下,方法是在XShell下面的输入框中输入命令cd /usr/local/software,回车,如下图所示。注意:下图输入框左边的图标要是多窗口图标,如果当前不是多窗口图标,可以点击输入框后面的那个图标,选择“全部XShell(X)”。
2、解压,我们在下面的输入框中输入tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/并按回车即可在两台设备同时进行解压操作。
3、安装一个软件包,在下面的输入框中输入:yum install -y openssl openssl-devel并按回车即可在两台设备同时安装软件包openssl。
解压完之后,我们可以到/usr/local目录下查看一下,发现已经有解压好的keepalived-1.2.18了。
4、对keepalived进行配置,我们在下面的输入框中输入cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived并按回车即可在两台设备同时进行配置。
5、进行编译安装,我们在下面的输入框中输入make && make install并按回车,即可在两台设备同时进行编译安装。
安装完nginx之后,我们把keepalived做成一个服务,这样可以做到开机自动启动,步骤如下:
1、创建/etc/keepalived目录,我们在下面的输入框中输入mkdir /etc/keepalived并按回车,即可同时在两台设备上创建/etc/keepalived。
2、复制几个文件到指定目录
先复制第一个文件,我们在下面的输入框中输入cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/并按回车,即可在两台设备同时完成复制操作。
下面复制第二个文件,我们在下面的输入框中输入cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/并按回车,即可同时在两台设备上完成复制该文件操作。
下面复制第三个文件,我们在输入框中输入cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/并按回车,即可在两台设备同时执行复制文件操作。
3、创建两个软链接
首先创建第一个软链接,我们在下面的输入框中输入ln -s /usr/local/sbin/keepalived /usr/sbin/并按回车即可完成在两台设备上同时创建软链接。
下面我们创建第二个软链接,我们在下面的输入框中输入ln -s /usr/local/keepalived/sbin/keepalived /sbin/并按回车即可同时在两台设备上创建该软链接。
4、设置成开机启动,我们在下面的输入框中输入chkconfig keepalived on并按回车即可完成对两台设备同时设置keepalived服务开机启动。
既然设置成了系统服务,那么我们便尝试使用service keepalived start来启动该服务。如下图所示,发现两台设备都可以正常启动keepalived服务,说明我们设置是成功的。
我们可以重启服务也可以关闭服务,如下所示。
[root@nginx2 usr]# service keepalived restart 停止 keepalived: [确定] 正在启动 keepalived: [确定] [root@nginx2 usr]# ps -ef | grep keepalived root 3131 1 0 00:38 ? 00:00:00 keepalived -D root 3133 3131 0 00:38 ? 00:00:00 keepalived -D root 3134 3131 0 00:38 ? 00:00:00 keepalived -D root 3136 1373 0 00:38 pts/0 00:00:00 grep keepalived [root@nginx2 usr]# service keepalived stop 停止 keepalived: [确定] [root@nginx2 usr]# ps -ef | grep keepalived root 3157 1373 0 00:38 pts/0 00:00:00 grep keepalived [root@nginx2 usr]#下面我们便使用keepalived来实现nginx的高可用
1、我们需要修改下/etc/keepalived/keepalived.conf文件,首先修改192.168.156.11上的这个文件,修改后的配置内容如下。
! Configuration File for keepalived global_defs { router_id nginx1 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight -20 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 11 mcast_src_ip 192.168.156.11 priority 100 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.156.110 } }下面我们来具体学习下配置的意思,首先global_defs当中配置的是主机名,我的192.168.156.11的主机名是nginx1,因此这里配置的router_id的值是nginx1。
global_defs { router_id nginx1 }接着看下面这段配置,这段配置的意思是,每隔2秒中去执行/etc/keepalived/nginx_check.sh脚本一次,这项检查从开始便一直进行,interval表示间隔时间,weight -20的意思是,脚本执行成功后把192.168.156.11这个节点的优先级降低20。
vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight -20 }接着看下面这段配置,state MASTER表示该节点角色定义为MASTER,interface eth0是指虚拟机的网卡是eth0。virtual_router_id 11这项配置非常重要,两个节点的这项配置的值必须一样,否则会出现乱七八糟的问题,这里我把virtual_router_id的值设置为11是取自192.168.156.11的最后两位数字。mcast_src_ip 192.168.156.11这项配置是指定当前节点的真实IP。priority 100的意思是优先级,这里暂且设置为100,当然也可以是其它值。优先级在keepalived实现高可用方面起着至关重要的作用,keepalived服务器就是根据优先级来选择当前提供服务的设备的,192.168.156.11刚开始设置的优先级是100,192.168.156.12刚开始设置的优先级是90,这样keepalived一开始去检查优先级,发现192.168.156.11这台设备的优先级高,于是便让该设备对外提供服务,当192.168.156.11这台设备的nginx挂掉后,由于nginx_check.sh脚本每两秒执行一次,发现192.168.156.11这个节点没有nginx进程后便尝试进行重新启动nginx,如果重新启动还是不行的话,就杀掉所有的keepalived进程,并告诉keepalived服务器192.168.156.11这个节点的nginx挂掉了同时会把这个节点的优先级减20,从而优先级变为了80,这样下次keepalived来检查优先级发现192.168.156.12这个节点的优先级比较高(90),于是便让192.168.156.12这个节点对外提供服务,同理,这个节点发生故障的话,也会再去让另外一个节点来提供服务,这就实现了高可用。
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 11
mcast_src_ip 192.168.156.11
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.156.110
}
}
那么怎么查看虚拟机的网卡是什么呢?我们使用命令ip a来查看,如下图所示,可以看到192.168.156.11这台虚拟机的网卡是eth0。而且现在可以看到这台设备只有一个IP地址,等一会儿配置好之后,会有虚拟IP的信息。
下面我们来看如下配置,这段配置两个节点要一样,表明它们属于一个组,keepalived会同一组中去做检查并保持高可用。
authentication { auth_type PASS auth_pass 1111 }下面再看这段配置,这段配置中的"chk_nginx"与我们在上面定义的定时执行脚本配置(vrrp_script chk_nginx)的名称要一样。
track_script { chk_nginx }下面再来看下面这段配置,这段配置的意思是对外提供的虚拟IP,这里可以是一个也可以是多个。
virtual_ipaddress { 192.168.156.110 }看完了配置文件,我们再来看下定时检查nginx的脚本文件nginx_check.sh,如下所示(注意:wc -l的"l"是小写的L而不是1)。
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 -1` -eq 0 ];then killall keepalived fi fi我们来学习下这个脚本的意思,下面这行的意思是,使用ps -C nginx --no-header |wc -1命令去检查当前nginx的进程数量并把查询到的进程数量赋值给变量A。
A=`ps -C nginx --no-header |wc -l`下面这行脚本的意思是,如果查询到的nginx的进程数量是0的话,就执行if条件里的内容。
if [ $A -eq 0 ];then下面这行代码的意思是由于检查到当前没有nginx进程,因此尝试去启动nginx。
/usr/local/nginx/sbin/nginx下面这行脚本的意思是启动nginx之后休眠2秒。
sleep 2下面这段脚本的医生说是如果nginx的进程数还是0的话,就认为nginx已经挂掉了,需要杀掉这个节点上所有的keepalived进程。
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi两个文件所在的目录是/etc/keepalived,如下所示。
[root@nginx1 keepalived]# pwd /etc/keepalived [root@nginx1 keepalived]# ll 总用量 8 -rw-r--r--. 1 root root 554 4月 9 01:51 keepalived.conf -rw-r--r--. 1 root root 180 4月 9 03:30 nginx_check.sh [root@nginx1 keepalived]#
以上便是192.168.156.11节点上的配置文件和脚本的内容。我们在192.168.156.12这个节点上也需要有这两个文件,192.168.156.12这个节点上keepalived.conf文件的内容如下:注意virtual_router_id的值要与192.168.156.11这个节点配置的值要一致。
! Configuration File for keepalived global_defs { router_id nginx2 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight -20 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 11 mcast_src_ip 192.168.156.12 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.156.110 } }nginx_check.sh脚本文件在两个节点上内容一样,192.168.156.12节点上两个文件目录与192.168.156.11一样,如下所示。
[root@nginx2 keepalived]# pwd /etc/keepalived [root@nginx2 keepalived]# ll 总用量 8 -rw-r--r--. 1 root root 553 4月 9 02:35 keepalived.conf -rw-r--r--. 1 root root 180 4月 9 02:41 nginx_check.sh [root@nginx2 keepalived]#由于目前nginx_check.sh脚本只有读权限,因此我们需要把两个节点上这个文件的权限放开,如下图所示。
上面做好了铺垫之后,我们现在启动nginx,不过在启动nginx之前要保持两个节点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; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #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; # } #} }为了能够区分欢迎页是哪个节点的欢迎页,我们修改下欢迎页的信息,如下图所示。
下面我们来重新启动启动两个节点的nginx,如下所示。
[root@nginx1 html]# /usr/local/nginx/sbin/nginx -s reload [root@nginx1 html]#
[root@nginx2 html]# /usr/local/nginx/sbin/nginx -s reload [root@nginx2 html]#启动nginx之后,我们首先直接访问192.168.156.11的nginx首页,如下图所示。
下面我们再直接访问192.168.156.12的nginx首页,如下图所示
下面我们启动两个节点上的keepalived,如下图所示。
启动keepalived之后,我们可以在两个节点上看到共同的虚拟IP192.168.156.110,如下图所示。
未完,待续。
nginx和keepalived实现nginx高可用