lvs+nginx反向代理+keepalived高可用集群

时间:2022-12-19 10:51:51

配置环境:CentOS7.3, ipvsadm v1.27, nginx v1.14.0, keepalived v1.3.5

外网服务ip为172.16.1.10(客户端请求IP地址,vip)

内网ip段为192.168.1.0/24

lvs1和lvs2分配内网IP(dip)为192.168.1.73

nginx1分配ip为192.168.1.71

nginx2分配ip地址为192.168.1.72

realserver群分配ip为192.168.1.172和192.168.1.141

先来个图:

 lvs+nginx反向代理+keepalived高可用集群

centos安装后yum安装ipvsadm和keepalived

先冲Nginx开始吧啊

nginx服务器我选择了使用源码编译安装

先安装需要的各种库。我直接继续用yum比较方便嘛,直接一个一个源码安装要人命了

yum install gcc pcre-devel openssl-devel zlib-devel

我nginx使用了www用户和用户组来启动,所以需要添加一下www用户和组

./configure --prefix=/usr/local/nginx --http-client-body-temp-path=/tmp/clientbody --http-proxy-temp-path=/tmp/proxy --http-fastcgi-temp-path=/tmp/fastcgi --http-uwsgi-temp-path=/tmp/uwsgi --http-scgi-temp-path=/tmp/scgi --user=www --group=www --with-file-aio --with-http_realip_module --with-http_ssl_module  --with-http_gzip_static_module  --with-http_stub_status_module

然后编辑一个启动脚本,因为centos7已经是用了systemctl来控制启动关闭,所以我用了systemctl的脚本格式

vim /usr/lib/systemd/system/nginx.service

[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

 

参看selinux状态

/usr/sbin/sestatus -v 

关闭selinux

临时关闭(不用重启机器):

setenforce 0

永久关闭selinux

vim /etc/selinux/config

SELINUX=disabled

顺便也关闭了firewalld服务或者开放相关需要使用的端口80等

注:基本上生产环境我还没见过用selinux的。。。所以一般情况下,还是把它关了或者改成只记录不限制的模式(permissive)。不然你会发现很多读写的操作的进程会发生各种诡异的事情。

先配置nginx反向代理:

使用ngx_http_proxy_module+ngx_http_upstream_module模块完成

    upstream RealServer {
        server 192.168.1.172:80;
        server 192.168.1.141:80;
        }

    server {
        listen       80;
        server_name  localhost;

        try_files $uri $uri/ /index.php?$query_string;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        location / {
            proxy_redirect off;
            proxy_pass http://RealServer;
        }

这里我直接使用了轮询的默认方式。权重默认(不写weight=#)为1

如果需要session回话保持最简单的方法可以使用iphash,

也可以使用会话亲缘关系算法(将来自同一个客户端的请求被传递到一组服务器中的同一台服务器上(会话保持))。语法:sticky cookie|route|learn  .....

如果需要更好的负债均衡效果也可以选择least_conn;最少连接数算法(同lvs中的wlc算法)

因为我RealServer是2台LNMP服务器,所以我这边就直接RR轮询了。而且因为右端使用的session使用的是一台redis服务器所以并没有考虑session保持的问题(因为不需要嘛)

至此nginx反向7层代理已经完成了。

还有一个小问题就是需要把nginx服务器的网关设置为lvs1和lvs2分配内网IP(dip)192.168.1.73

接下来配置lvs

这里我选择了lvs-nat模式,并没有使用lvs-dr模式。所以相对简单一些

首先开通转发核心转发功能vim /etc/sysctl.conf # 开启本地路由转发

net.ipv4.ip_forward = 1

sysctl -p#直接生效

添加管理集群服务
添加管理集群服务中的Realserver服务器2台,通过172.16.1.10:80转发至192.168.1.71:80和192.168.1.72:80

因为我这里没有选择选择默认选项,默认的调度方法(转发规则)是wlc((加权最小连接数)。

ipvsadm -A -t 172.16.1.10:80 -s rr
ipvsadm -a -t 172.16.1.10:80 -r 192.168.1.71:80 -m
ipvsadm -a -t 172.16.1.10:80 -r 192.168.1.72:80 -m  

注:这里必须使用-m选项,以使用lvs-nat模式,默认是使用route模式的也就是-g参数等于lvs-dr

 [-g|i|m](lvs-type):

-g:gateway,lvs-dr(direct routing)
-i:ipip,lvs-tun(ip tunneling)
-m:masquerade,lvs-nat

直接使用-s 参数,设置为调度方*询,当然也可以使用其他的如:SH #Source Hash(源地址哈希,实现session保持机制的一种方法,将来自于同一个IP的请求始终调度至同一个上游服务器,有点像nginx的iphash)

突然发现lvs配置和iptables一样简单啊哇哈哈

最后保存一下配置

ipvsadm-save -n > /etc/sysconfig/ipvsadm

也可以使用systemctl stop ipvsadm

这里有个小坑,就是ipvsadm-save无法直接保存,必须使用具体路径,这个可以看一下/usr/lib/systemd/system/ipvsadm.service文件。

systemctl enable ipvsadm

设置开机自启动服务

现在把172.168.1.10的vip和192.168.1.73的dip配置到其中一台lvs上,就已经可以访问到网站了。不怕nginx宕机了

最后来做keepalived高可用使用两台LVS自动在故障时切换

 编辑keepalived配置文件

 vim /etc/keepalived/keepalived.conf

这个配置文件格式基本上和nginx类似

主节点配置

global_defs {
   notification_email {
     colin.shi@hotmail.com
   }
   notification_email_from colin.shi@colinshi.top
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lvs1.colinshi.top
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 44
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.1.73/24 brd 192.168.1.255 dev ens33 label ens33:dip
        172.16.1.10/24 brd 172.16.1.255 dev ens33 label ens33:vip
    }
}
从节点配置
global_defs {
   notification_email {
     colin.shi@hotmail.com
   }
   notification_email_from colin.shi@colinshi.top
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lvs2.colinshi.top
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 44
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.1.73/24 brd 192.168.1.255 dev ens33 label ens33:DIP
        172.16.1.10/24 brd 172.16.1.255 dev ens33 label ens33:VIP
    }
}

 


global_defs 全局配置
notification_email 将收到通知邮件列表的电子邮件帐户
notification_email_from SMTP命令发送使用的电子邮件账户名称,可以有多个
smtp_server 用于发送邮件通知的远程SMTP服务器
smtp_connection_timeout 指定SMTP服务器的超时时间
lvs_id lvs控制器的名称随便写都行
特别说一下里面有几个参数我在官网没有找到相关的说明,但是在默认配置文件中却有
#vrrp_strict
其中在全局配置下使用了vrrp_strict 参数。此参数为严格控制VRRP协议,不支持单播模式,注释掉此选项,将不会默认添加DROP规则。
一开始一直出现可以绑定IP但是无法ping和访问的问题。发现如果启用了vrrp_strict选项,会自动在iptables下创建一条规则DROP所有VIP连接。
keepalived功能很强大。可以启用同步组功能,还可以通过keepalived配置lvs在主从切换时自动更改lvs配置,提供主从切换时的运行脚本。