配置环境: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
先来个图:
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 serverAfter=network.target remote-fs.target nss-lookup.target[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.confExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=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 rripvsadm -a -t 172.16.1.10:80 -r 192.168.1.71:80 -mipvsadm -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配置,提供主从切换时的运行脚本。