nginx+keepalived实现双机热备份 故障转移 动态分离

今天做了一个实验,nginx+keepalived实现双机热备份,由于自己也是新手,所以刚开始也遇到了很多的问题,虽然原理是看懂了,但是在操作过程中还是遇到了很多的问题,在此写这篇博客记录下操作过程的一些步骤以及问题记录下来。

   在本博客中我也转载了一篇nginx+keepalived实现双机热备份,那篇文章的思想及原理写的很好,还有那个构架图,可以供参考,下来我就来贴出我实验过程的一些步骤吧:

  在此如何安装机子的环境和软件安装这里就不做介绍了,这里只贴出一些步骤和配置文件:

一、实验准备:

   front1:nginx机器  IP:192.168.1.26  (keepalived master)

   front2: nginx机器  IP: 192.168.1.27  (keepalived backup)

   VIP:192.168.1.50

   后端机子:一台安装tomcat(IP:192.168.1.11)   一台安装 php(IP:192.168.1.17)

二、实验目的:

  本实验的目的是利用nginx做反向代理,负载均衡,实现利用前端机子的nginx实现动态分离的效果,让.jsp文件丢给后端的tomcat机子处理,让.php和.html文件丢个后端的php机子处理,这样可以减少前端的负载,实现负载均衡,同时我们也需要在前端搭建两台front,目的是实现高可用,稳定性,实现故障转移,当前端front一台主挂掉的情况下在5秒内自动切换到从上,避免单点故障的发生

三、参考架构图(图为转载)

  

四、实验步骤:

 准备四台机子,两台做前端(front),两台后端机子,一台运行tomcat,一台运行php

各自搭建好环境,这里环境搭建就不介绍了,

搭建好环境之后,我们来配置front机子的nginx配置文件:

  
  
  
  
  1. # vim /usr/local
  2. upstream test{ 
  3.     server 172.28.14.142:81; 
  4.  
  5. upstream tomcat { 
  6.     server 192.168.1.11:8080; 
  7.  
  8. upstream nginx { 
  9.     server 192.168.1.17:80; 
  10.  
  11.    ############# server ################ 
  12.    server { 
  13.        listen       80; 
  14.        server_name  www.abc.com; 
  15. root /usr/local/www/abc; 
  16. index index.php index.jsp index.do index.html index.htm; 
  17.  
  18.        location / { 
  19.         proxy_set_header Host $host; 
  20.     proxy_set_header X-Real-IP $remote_addr; 
  21.     proxy_set_header X-Forwarded-For $remote_addr; 
  22.     include fastcgi_params; 
  23.  
  24.  
  25.     proxy_pass http://nginx; 
  26. location ~ .*\.(php|php5)?$ { 
  27.     proxy_pass http://nginx; 
  28.     root /usr/local/www/abc; 
  29.     include fastcgi_params; 
  30.     index index.php; 
  31.     proxy_set_header Host $host; 
  32.     proxy_set_header X-Forwarded-For $remote_addr; 
  33.     include /usr/local/nginx/conf/proxy_store_off.conf; 
  34. location ~ .*\.(jsp|do|jspx)?$ { 
  35.     proxy_pass http://tomcat; 
  36.     proxy_set_header Host $host; 
  37.     proxy_set_header X-Forwarder-For $remote_addr; 
  38.     include /usr/local/nginx/conf/proxy_store_off.conf; 
  39. location ~ .*\.(html|htm)?$ { 
  40.     index index.html; 
  41.     proxy_pass http://nginx; 
  42.     proxy_set_header Host $host; 
  43.     proxy_set_header X-Forwarded-For $remote_addr; 
  44.     expires 1h; 
  45. location ~ .*\.(jpg|jpeg|gif|png|bwp|swf)?$ { 
  46.     expires 30d; 
  47. location ~ .*\.(css|js)?$ { 
  48.     expires 1h; 
  49. access_log /var/log/www.abc.com.log main; 
  50.    } 
  51. # vim /usr/local/nginx/conf/proxy_store_off.conf
  52. proxy_redirect off;
  53. proxy_set_header Host $host;
  54. proxy_set_header X-Real-IP $remote_addr;
  55. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  56. client_max_body_size 50m;
  57. client_body_buffer_size 256k;
  58. proxy_connect_timeout 300;
  59. proxy_send_timeout 300;
  60. proxy_read_timeout 300;
  61. proxy_buffer_size 32k;
  62. proxy_buffers 4 64k;
  63. proxy_busy_buffers_size 128k;
  64. proxy_temp_file_write_size 128k;
  65. proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
  66. proxy_max_temp_file_size 128m;
  67. proxy_store off;

前端front两台的nginx配置文件完全一样,配置完后scp到另外一台,

如:scp nginx.conf [email protected]:/usr/local/nginx/conf/

接下来我们来为前端front机子配置keepalived,keepalived安装这里介绍一下,

 

   
   
   
   
  1. #编译安装keepalived 
  2.   #tar zxvf keepalived-1.2.2.tar.gz  
  3.   #cd keepalived-1.2.2   
  4.   # ./configure --sysconf=/etc \ 
  5. --with-kernel-dir=/usr/src/kernels/2.6.18-8.e15-i686 
  6.  # make 
  7.  #make install 
  8.  # ln -s /usr/local/sbin/keepalived /sbin 

安装完后,我们需要给keepalived配置,配置文件如下:

 

   
   
   
   
  1. ! Configuration File for keepalived 
  2.  
  3. global_defs { 
  4.    notification_email { 
  5.     [email protected]    
  6.    notification_email_from 244896418.com 
  7.    smtp_server 127.0.0.1 
  8.    smtp_connect_timeout 30 
  9.    router_id LVS_DEVEL 
  10.  
  11. vrrp_script chk_http_port {  
  12.                 script "/root/sh/nginx_pid.sh"  
  13.                 interval 2  
  14.                 weight 2  
  15. }  
  16.  
  17. vrrp_instance VI_1 { 
  18.     state MASTER (从服务器改为BACKUP)
  19.     interface eth0 
  20.     virtual_router_id 51 
  21.     mcast_src_ip 192.168.1.26 (此IP为本机的IP)
  22.     priority 100 (从服务器的改成小于100就可以)
  23.     advert_int 1 
  24.     authentication { 
  25.         auth_type PASS 
  26.         auth_pass 1111 
  27.     } 
  28.  
  29.  track_script {  
  30.                 chk_http_port  
  31.         }  
  32.  
  33.     virtual_ipaddress { 
  34.     192.168.1.50 
  35.     } 
  36.  
  37. 标记为红色的为自己写的一个脚本,用来检测本机的nginx是否正常的运行,如果不nginx挂掉试着重新启动,如果启动后
  38. 又挂掉,那么就直接杀掉keepalived进程,将转移到keepalived从服务器上,实现故障转移
  39.  
          
          
          
          
    1. # vim nginx_pid.sh
    2. #!/bin/bash  
    3. A=`ps -C nginx --no-header |wc -l`                ## 查看是否有 nginx进程 把值赋给变量A  
    4. if [ $A -eq 0 ];then                                         ## 如果没有进程值得为 零  
    5.                 /usr/local/nginx/sbin/nginx 
    6.                 sleep 3 
    7.                 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 
    8.                        killall keepalived                        ## 则结束 keepalived 进程  
    9.                 fi 
    10. fi 
    11.  
    12. # chmod +x nginx_pid.sh
    13.  
    14. 前端front从服务器的配置也完全一样,只是在keepalived的配置文件中需要修改几个地方就可以

     

 到此,前端的配置完成,如果没有出错的话都可以实现,接下来就来提出后端机子的nginx配置,其他的就不再做介绍了

 

  
  
  
  
  1. server { 
  2.         listen       80; 
  3.         server_name  www.abc.com; 
  4.     root /usr/local/www/abc; 
  5.     index index.php index.jsp index.do index.html index.htm; 
  6.  
  7.         location / { 
  8.         root /usr/local/www/abc; 
  9.         index index.html index.php index.jsp index.do default.do; 
  10.             proxy_set_header Host $host; 
  11.         proxy_set_header X-Real-IP $remote_addr; 
  12.         proxy_set_header X-Forwarded-For $remote_addr; 
  13.         include fastcgi_params; 
  14.         include /usr/local/nginx/conf/proxy_store_off.conf; 
  15.     } 
  16.     location ~ .*\.(php|php5)?$ { 
  17.         root /usr/local/www/abc; 
  18.         include fastcgi_params; 
  19.         index index.php; 
  20.         proxy_set_header Host $host; 
  21.         proxy_set_header X-Forwarded-For $remote_addr; 
  22.         include /usr/local/nginx/conf/proxy_store_off.conf; 
  23.         fastcgi_pass   127.0.0.1:9000; 
  24.                 fastcgi_index  index.php; 
  25.                 fastcgi_param  SCRIPT_FILENAME  /usr/local/www/abc$fastcgi_script_name; 
  26.             fastcgi_param  QUERY_STRING       $query_string; 
  27.                 fastcgi_param  REQUEST_METHOD     $request_method; 
  28.                 fastcgi_param  CONTENT_TYPE       $content_type; 
  29.                 fastcgi_param  CONTENT_LENGTH     $content_length; 
  30.                 fastcgi_param  REQUEST_URI        $request_uri; 
  31.     } 
  32.     location ~ .*\.(jsp|do|jspx)?$ { 
  33.         proxy_pass http://tomcat; 
  34.         root /usr/local/www/abc; 
  35.         proxy_set_header Host $host; 
  36.         proxy_set_header X-Forwarder-For $remote_addr; 
  37.         include /usr/local/nginx/conf/proxy_store_off.conf; 
  38.     } 
  39.     location ~ .*\.(html|htm)?$ { 
  40.         root /usr/local/www/abc; 
  41.         index index.html ; 
  42.         proxy_set_header Host $host; 
  43.         proxy_set_header X-Forwarded-For $remote_addr; 
  44.         expires 1h; 
  45.     } 
  46.     location ~ .*\.(jpg|jpeg|gif|png|bwp|swf)?$ { 
  47.         expires 30d; 
  48.     } 
  49.     location ~ .*\.(css|js)?$ { 
  50.         expires 1h; 
  51.     } 
  52.     access_log /var/log/www.abc.com.log.log main; 
  53.     } 
  54.  

接下来可以来启动下nginx和keepalived进行测试结果,首先我们来启动keepalived主服务器的,并且查看日志:# service keepalived start

  
  
  
  
  1. Jan 10 16:10:16 localhost Keepalived_vrrp: VRRP_Script(chk_http_port) succeeded 
  2. Jan 10 16:10:17 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE 
  3. Jan 10 16:10:18 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE 
  4. Jan 10 16:10:18 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs. 
  5. Jan 10 16:10:18 localhost avahi-daemon[3490]: Registering new address record for 192.168.1.50 on eth0. 
  6. Jan 10 16:10:18 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.50 
  7.  

从服务器keepalived日志

  
  
  
  
  1. Jan 10 16:11:48 front2 Keepalived_vrrp[15836]: VRRP_Instance(VI_1) Entering BACKUP STATE 
  2. Jan 10 16:11:48 front2 Keepalived_vrrp[15836]: VRRP sockpool: [ifindex(2), proto(112), fd(11,12)] 
  3. Jan 10 16:11:48 front2 Keepalived_vrrp[15836]: VRRP_Script(chk_http_port) succeeded 

接下来可以自己杀掉主的nginx进程看是否会自动启动nginx,也可以测试停掉主的keepalived进程,查看是否从keepalived日志有接管过来,在查看nginx日志

 

到此结束,由于自己能力有限,只能给大家提供这些参考了,哪里有错误的还请大家指正,谢谢

 

你可能感兴趣的:(故障转移,双机热备份,动态分离)