本文描述:nginx基于keepalived实现高可用,基于自身的proxy功能代理web服务器,并实现负载均衡。

实验环境:redhat5.8
实验拓扑结构:nginx+keepalived服务器2台,apache服务器2台,构建简单的高可用集群

 

 

ip分配:

 
  
  1. nginx1.weiyang.org 192.168.3.22 nginx1
  2. nginx2.weiyang.org 192.168.3.33 nginx2
  3. apache1.weiyang.org 192.168.3.205 apache205
  4. apache2.weiyang.org 192.168.3.206 apache206

一、实验环境安装和配置
nginx和apache的安装配置这里就不细说了,我采用的是编译安装;需要注意的是两台apache的网页文件目录下的index.html中内容分别是:it works from 205 和 it works from 206;便于我们来区分是否实现了负载均衡的效果(注:这里只是虚拟机中的简单实验,实际生产环境中文件必须保持一致)

二、在前端两台nginx上安装keepalived
keepalived的下载地址:http://www.keepalived.org/download.html;这里我使用最新的1.2.7版本。
注:事先yum安装开发包组“Development Tools” “Development Libraries” 已事先安装完毕
<1>下载完成后解压安装:

 
  
  1. #tar xvf keepalived-1.2.7.tar.gz
  2. #cd keepalived-1.2.7
  3. #./configure --prefix=/usr/local/keepalived ##指定keepalived的安装目录
  4. #make && make install

<2>安装完成后,为keepalived提供配置文件和服务脚本

 
  
  1. #mkdir /etc/keepalived ##为keepalived创建配置文件目录,默认配置文件从/etc/keepalived下读取
  2. #cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ ##复制keepalived的二进制命令
  3. #cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ ##提供启动脚本
  4. #cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ ##keepalived的主配置文件

<3>编辑/etc/keepalived/keepalived.conf文件,修改内容如下:

 
  
  1. ! Configuration File for keepalived  
  2.  
  3. global_defs {  
  4.    notification_email {  
  5.      acassen@firewall.loc  
  6.      failover@firewall.loc  
  7.      sysadmin@firewall.loc  ##这三个都是邮箱地址,意思是当发生故障时向这三个邮箱发送邮件  
  8.    }  
  9.    notification_email_from Alexandre.Cassen@firewall.loc    ##以哪个邮箱向上边定义的三个邮箱发送邮件  
  10.    smtp_server 127.0.0.1  
  11.    smtp_connect_timeout 30 ##smtp连接超时时间  
  12.    router_id LVS_DEVEL  ##服务器标识符  
  13. }  
  14.  
  15. vrrp_instance VI_1 {  
  16.     state MASTER ##主服务器,从服务器设置为BACKUP;当master发生故障时,会自动转移到从上作为主,当主恢复工作时,再自动转移到定义的主上  
  17.     interface eth0 ##指定从哪个网卡发送VRRP信息的  
  18.     virtual_router_id 51 ##虚拟路由的组id,主和从必须在同一个组  
  19.     priority 100 ##优先权,从的设置为80  
  20.     advert_int 1   
  21.     authentication {  
  22.         auth_type PASS ##认证方式  
  23.         auth_pass 1111  ##认证的密钥  
  24.     }  
  25.     virtual_ipaddress {  
  26.         192.168.3.18    ##VRRP的ip,也就是向客户端开放的ip,即vip  
  27.     }  
  28. }  
  29.  配置到这里就可结束了,之下的这里用不到; 

<4>在另一台同样的方法配置;只要将priority 100 改为80即可(只要小于主定义的100即可);
 两台服务器上都启动keepalived服务:service keepalived start
 
<5>测试keepalived的效果
 在nginx1上执行如下命令:

 
  
  1. [root@nginx1 ~]# ip addr  
  2.     1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue   
  3.         link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  
  4.         inet 127.0.0.1/8 scope host lo  
  5.         inet6 ::1/128 scope host   
  6.             valid_lft forever preferred_lft forever  
  7.     2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000  
  8.         link/ether 00:0c:29:e7:cb:a0 brd ff:ff:ff:ff:ff:ff  
  9.         inet 192.168.3.22/24 brd 192.168.2.255 scope global eth0  
  10.         inet 192.168.3.18/32 scope global eth0  
  11.         inet6 fe80::20c:29ff:fee7:cba0/64 scope link   
  12.             valid_lft forever preferred_lft forever  
  13.     3: sit0: <NOARP> mtu 1480 qdisc noop   
  14.         link/sit 0.0.0.0 brd 0.0.0.0  
  15.     ###vip绑定在nginx1上,现在我们停掉nginx1上的keepalived  
  16.       
  17.     #service keepalived stop    
  18.     ###在nginx2上执行ip addr 命令,看到如下结果:  
  19.     [root@nginx2 ~]# ip addr  
  20.     1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue   
  21.         link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  
  22.         inet 127.0.0.1/8 scope host lo  
  23.         inet6 ::1/128 scope host   
  24.             valid_lft forever preferred_lft forever  
  25.     2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000  
  26.         link/ether 00:0c:29:4f:9a:9d brd ff:ff:ff:ff:ff:ff  
  27.         inet 192.168.3.33/24 brd 192.168.2.255 scope global eth0  
  28.         inet 192.168.3.18/32 scope global eth0  
  29.         inet6 fe80::20c:29ff:fe4f:9a9d/64 scope link   
  30.             valid_lft forever preferred_lft forever  
  31.     3: sit0: <NOARP> mtu 1480 qdisc noop   
  32.         link/sit 0.0.0.0 brd 0.0.0.0  
  33.           
  34. 到此为止,基于keepalived实现nginx的高可用就成功了。。 

三、下面来做nginx的反向代理,构建简单的高可用负载均衡集群:
在前端两台nginx服务器上做同样的修改:
编辑nginx的配置文件:

 
  
  1. #vim /etc/nginx/nginx.conf  
  2.     user nginx nginx; ##以哪个用户和用户组运行nginx;安装nginx之前要先创建这个组和用户  
  3.     worker_processes  2;    ##开启几个进程  
  4.     events {  
  5.     use epoll;              ##nginx的工作机制  
  6.     worker_connections  1024;   ##单进程最大啊连接数,这是默认值,可修改为65535  
  7.     }  
  8.  
  9.  
  10.     http {  
  11.         include       mime.types;  
  12.         default_type  application/octet-stream;  
  13.     sendfile        on;  
  14.     #tcp_nopush     on;  
  15.  
  16.     #keepalive_timeout  0;  
  17.     keepalive_timeout  65;  ##nginx长连接时长  
  18.  
  19.     #gzip  on;  
  20.     upstream weiyang {      ##定义后端web服务器的cluster  
  21.         server 192.168.3.205:80 max_fails=3 fail_timeout=10s;   ##后端服务器的ip,以及最大错误数和超时时长  
  22.         server 192.168.3.206:80 max_fails=3 fail_timeout=10s;  
  23.     }  
  24.  
  25.  
  26.     server {  
  27.         listen       80;  
  28.         server_name  192.168.3.18;    ##vrrp的ip地址  
  29.         location / {  
  30.                 root   html;  
  31.                 index  index.html index.html;  
  32.                 proxy_pass http://weiyang/;     ##为哪个backend做反向代理  
  33.                 proxy_redirect off;  
  34.                 proxy_set_header X-Real-IP $remote_addr;  
  35.                 proxy_set_header X-Forwarded-For Proxy_add_x_forwarded_for;  
  36.         }  
  37.         location /nginx {       ##nginx的状态页面  
  38.                 access_log off;  
  39.                 stub_status on;  
  40.         }  
  41.  
  42.         #error_page  404              /404.html;  
  43.  
  44.         # redirect server error pages to the static page /50x.html  
  45.         #  
  46.         error_page   500 502 503 504  /50x.html;  
  47.         location = /50x.html {  
  48.             root   html;  
  49.         }  
  50.     }  
  51. }  
  52.  
  53. ##nginx做完配置文件更改后重启nginx服务,同时开启后端两台web服务器的httpd服务  
  54.  
  55. #service nginx restart  
  56. #service httpd start 

四、实现nginx+keepalived+apache构建高可用集群,我们还要修改如下信息:
试想,如果nginx1服务器上的nginx服务故障了,但keepalived服务运行正常,照样会形成单点故障;
为了实时的检测nginx服务的运行是否正常,这里写一个小脚本,来检测它的运行情况。
脚本实现思想:当nginx服务故障时,我们就直接杀掉keepalived的进程,来实现故障转移:
脚本如下:

 
  
  1. # vim ngpid.sh  
  2. #!/bin/bash    
  3. N='ps -C nginx --no-header |wc -l'                ## 查看是否有nginx进程,并对其做行计算,把计算值赋给变量N    
  4. if [ $N -eq 0 ];then                              ## if语句进行判断,若N不为0,此脚本执行结束;若N为0,试着重启nginx服务,睡2秒,   
  5.          service nginx start  
  6.          sleep 2                  
  7.          if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then   ##再次判断,若依然为0,  
  8.          killall keepalived                                   ##则直接杀掉keepalived的所有进程,实现故障转移     
  9.          fi   
  10. fi   
  11. # chmod +x ng_pid.sh  
  12.  
  13. 将此脚本放在/root/bash/下,并写入任务计划,每一小时执行一次,如下所示  
  14. echo -e '* 1 * * * /root/bash/ngpid.sh' >> /etc/crontab 

五、访问测试
在本地主机浏览器中输入如下地址:
http://192.168.3.18  查看页面显示结果是否轮询,
这时nginx1为高可用的主:将nginx服务停掉,稍等3秒。。
再次访问http://192.168.3.18  查看页面显示是否依然正常轮询

基于nginx的高可用负载均衡到此配置成功,新手一个,大家多多指教。。