docker中的Nginx与Keepalived

高可用:两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将将这个称之为高可用;

Keekpalived工作原理:通过vrrp协议实现的

安装:yum install keepalived -y
默认日志存放位置:/var/log/messages

下载完成之后,就先配置好keepalived

vi /etc/keepalived/keepalived.conf

首先你要了解keepalived.conf中配置项的含义是什么?我在这里就放我们需要配置的一些配置项稍作解释

MASTER配置

! Configuration File for keepalived

global_defs { ##全局定义
   router_id KEEPALIVED_MASTER ##你的路由id
   vrrp_skip_check_adv_addr
   vrrp_strict  #严格遵守vvrp协议的意思,建议注释掉,可能会访问不了vip 
   vrrp_garp_interval 0
   vrrp_gna_interval 0
 }
 vrrp_instance VI_1 { #实例1
    state MASTER #主服务器
    interface eth0 #网卡
    virtual_router_id 51  #虚拟路由id
    priority 100 #优先级 MASTE建议100 backup建议比MASTE低 80,70,90都可
    advert_int 1 #间隔时间
    
    authentication { #验证 主和副的配置这儿都一致
        auth_type PASS 
        auth_pass 1111
    }
    virtual_ipaddress { #这里配置的是你的虚拟IP,也就是VIP
       172.17.0.15
    }
}      


以下是BACKUP配置,和上面差不多

 ! Configuration File for keepalived
    global_defs {
    router_id KEEPALIVED_BACKUP #改这
   vrrp_skip_check_adv_addr
   vrrp_strict  
   vrrp_garp_interval 0
   vrrp_gna_interval 0
 } 
 vrrp_instance VI_1 { 
    state BACKUP  #这里也要改
    interface eth0 
    virtual_router_id 51 
    priority 80  #这里要比MASTE小
    advert_int 1 
    
  authentication { #保持一致
        auth_type PASS 
        auth_pass 1111
    }
    virtual_ipaddress { 
       172.17.0.16
    }
}        

以上配置完毕后退出,需要配置hosts文件

vi /etc/hosts
#做一个解析, 将 127.0.0.1 KEEPALIVED_MASTER 加入,backup一致操作

此时keepalived已经配置好了,重点来了。

#启动
systemctl start keepalived
#检查
systemctl status keepalived
#你会发现状态是 RUN,如果过几秒钟你再次检查,则是stop。如果你的没有这问题请略过

奉上我的解决方案与解决的思路

  • 首先去看看报错的log文件,去看看日志中报的是什么错。
  • 我发现默认存放日志文件的地址没有,/var/log/messages 并没有。
  • 那就自己手动设置,将keepalived的存放路径修改

修改keepalived日志路径

vim  /etc/sysconfig/keepalived  将文件的这一行 KEEPALIVED_OPTIONS="-D" 修改为      KEEPALIVED_OPTIONS="-D -d -S 0"
vim /etc/rsyslog.conf   ##如果容器中没有,请自己下载此服务
#在文件的最后添加一行
local0.*     /var/log/keepalived.log
重启rsyslog服务  systemctl restart  rsyslog  
重启keepalived服务,日志会打印到/var/log/keepalived.log

这样就比较明了了,这个错误说的是:IPVS:不能初始化IPVS:协议不可用,原因是ip_vs模块系统默认没有自动加载,可以通过lsmod | grep ip_vs 命令查看一下,如果没有任何输出则表示ip_vs模块并没有被内核加载,得手动加载modprobe ip_vsmodprobe ip_vs_wrr

解决办法

首先你必须得先安装ipvsadm

yum install ipvsadm
#执行
ipvsadm

#如果你执行后报错,如以下
IPVS: Can't initialize ipvs: Protocol not available
Can't initialize ipvs: Protocol not available
Are you sure that IP Virtual Server is built in the kernel or as module?

那还有最后一步,就是在宿主机中,也一样执行ipvsadm,然后再去容器中执行

执行ipvsadm,出现以下就成功了

然后就去restart keepalived。VIP就有了,也就是keepalived没有自杀了

如图所示,nginx1是master,nginx2是backup,当stop nginx1中的keepalived,vip就漂移到了nginx2中。

Nginx的配置文件

找到/etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
   
 upstream tyyz {
	server 192.168.30.31:8080 weight=2;
	server 192.168.30.31:8081 weight=1;
}
	


    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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

 server {
        listen       80;
        server_name  www.tyyz.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location =/ {
	rewrite .* http://www.tyyz.com/uc;
} 
        location / {
       
            proxy_pass   http://tyyz; 
        }

        #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;
        }
    }
    include /etc/nginx/conf.d/*.conf;
}