一、项目描述
用户使用域名访问两台nginx反向代理机的虚拟IP,并通过Keepalived进行负债均衡处理来实现高可用,再由代理机将用户的访问均衡地传到后端真实服务器
二、项目所用核心技术
nginx服务、Keepalived负载均衡、nfs挂载
三、项目环境准备
五台centOS7.9虚拟机,其中两台作为nginx(版本1.25.2)反向代理机,三台作为真实服务器
四、项目实现过程
1、规划网络拓扑图,分配用户、反向代理机、服务器
2、所有机器关闭selinux和防火墙
setenforce 0
service firewalld stop
3、在反向代理机上安装并配置nginx,采用默认的轮询算法
#yum安装 yum配置文件 --》 /etc/nginx:
yum install epel-release -y
yum install nginx -y
#检查是否安装成功
rpm -qa |grep nginx
默认的轮询算法:当有请求过来的时候,如果请求刚到被代理到down掉的后端真实机,会重新转发一次,转发到可以正常提供服务的真实服务器。这种检查被动,不能提前发现后端真实服务器的状态,而且可能会产生多一次转发,影响效率。
4、对两台代理机安装并配置Keepalived,开启Keepalived进行测试;同时使用Keepalived对代理机部署双vip高可用集群,解决单点问题,并利用双vip做负载均衡
#安装keepalived
yum install keepalived -y
#keepalived的配置文件目录: /etc/keepalived/keepalived.conf
#主服务器:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict #严格遵守vrrp协议
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.250
}
}
#备服务器:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict #严格遵守vrrp协议
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP #设置为备
interface ens33 #虚拟ip绑定到哪个网卡
virtual_router_id 51 #0-255#虚拟路由id 在同一个局域网内 来区分不同的keepalive集群 ,
#如果在同一个keepalive集群中,那每台主机的router id都是一样的
priority 50 #0-255优先级, 优先越高拿到虚拟ip的概率就会越大
advert_int 1 #隔1s钟发送一次存活检测
authentication { #认证方式
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟ip
192.168.10.250
}
}
#启动服务
systemctl start keepalived
#查看是否启动成功
ps -ef |grep keepalived
#查看vip是否在主服务器上
ip add
#关闭主服务器上的keepalived,查看vip是否在备服务器上
systemctl stop keepalived
#再启动主服务器上的keepalived,查看vip是否回到主服务器上
systemctl start keepalived
开启keepalived后,vip在权重较大的主服务器上
关闭keepalived后,vip离开主服务器,转移到备服务器
重新启动keepalived,vip又回到主服务器
keepalived已配置完成且可以正常运行,接下来修改配置形成双vip环境
#修改192.168.10.250为主的服务器配置:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict #严格遵守vrrp协议
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port {
script "/opt/check_nginx.sh"
interval 2
weight -60
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 60
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.10.250
}
}
vrrp_instance VI_2 {
state BACKUP #设置为备
interface ens33 #虚拟ip绑定到哪个网卡
virtual_router_id 61 #0-255#虚拟路由id 在同一个局域网内 来区分不同的keepalive集群 ,
#如果在同一个keepalive集群中,那每台主机的router id都是一样的
priority 50 #0-255优先级, 优先越高拿到虚拟ip的概率就会越大
advert_int 1 #隔1s钟发送一次存活检测
authentication { #认证方式
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟ip
192.168.10.251
}
}
#修改192.168.10.251为主的服务器配置:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict #严格遵守vrrp协议
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP #设置为备
interface ens33 #虚拟ip绑定到哪个网卡
virtual_router_id 60 #0-255#虚拟路由id 在同一个局域网内 来区分不同的keepalive集群 ,
#如果在同一个keepalive集群中,那每台主机的router id都是一样的
priority 50 #0-255优先级, 优先越高拿到虚拟ip的概率就会越大
advert_int 1 #隔1s钟发送一次存活检测
authentication { #认证方式
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟ip
192.168.10.250
}
}
vrrp_instance VI_2 {
state MASTER #设置为备
interface ens33 #虚拟ip绑定到哪个网卡
virtual_router_id 61 #0-255#虚拟路由id 在同一个局域网内 来区分不同的keepalive集群 ,
#如果在同一个keepalive集群中,那每台主机的router id都是一样的
priority 100 #0-255优先级, 优先越高拿到虚拟ip的概率就会越大
advert_int 1 #隔1s钟发送一次存活检测
authentication { #认证方式
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟ip
192.168.10.251
}
#重启keepalived服务,完成配置
systemctl restart keepalived
250的主服务器在ip为192.168.10.140的代理机上,备服务器在ip为192.168.10.129的代理机上
251的主服务器在ip为192.168.10.129的代理机上,备服务器在ip为192.168.10.140的代理机上
5、在nginx反向代理机上添加检测脚本,查看nginx是否能完成负债均衡,即只要192.168.10.250的主机器监控(通过脚本)到ngin服务停止,则主机器自己停止keepalived,将VIP交给备份机器处理web请求,直至主机器再次恢复正常,将VIP返还给主机器
#根据nginx服务检测
#添加检测脚本:
vim /opt/check_nginx.sh
/usr/sbin/pidof nginx &>/dev/null
#添加权限
chmod +x check_nginx.sh
#修改192.168.10.250为主的服务器配置:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict #严格遵守vrrp协议
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port {
script "/opt/check_nginx.sh" #检测脚本位置
interval 2 #检测间隔
weight -60 #当检测脚本返回非0,将优先级-60
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 60
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#添加检测脚本
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.10.250
}
}
250的主机器监控到nginx服务停止,则主机器自己停止keepalived,将vip交给备机器处理web请求
6、在服务器上安装flask、nfs,并在其中一台服务器上配置好flask程序
#在所有后端服务器上,安装python3
yum install python3 -y
pip3 install flask
#在其中一台服务器上编辑flask测试程序:
vim flask-test.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "this is flask index"
@app.route("/test")
def test():
return "this is flask test"
app.run(host="0.0.0.0")
#运行flask web
nohup python3 flask-test.py &nohup: #忽略输入并把输出追加到"nohup.out"
7、使用nfs技术将没有flask代码程序的两台服务器挂载到有flask代码程序的服务器上,重启nfs,完成挂载
#在三台服务器上都安装nfs:
yum install nfs-utils
#在有flask代码的服务器上启动nfs
systemctl start nfs
#在有flask代码的服务器上编辑/etc/exports文件
vim /etc/exports
/opt/flaskapp 192.168.10.140(ro,no_root_squash)
/opt/flaskapp 192.168.10.141(ro,no_root_squash)
#生效
exportfs
systemctl restart nfs
#将没有flask程序的两台服务器挂载到有flask程序的服务器上
mount -t nfs 192.168.10.129:/opt/flaskapp /opt/flaskapp
#三台后端真实服务器上都启动flask 注意要在/opt/flaskapp目录下执行:
gunicorn flask-test:app -b "0.0.0.0:5000" --access-logfile="./flask.log" &
注意:另外两台机器上的日志文件需要单独创建
8、在完成keepalived高可用和nfs配置之后对nginx机器进行反向代理配置
#反向代理,nginx配置文件修改
upstream test {
server 192.168.10.140:5000;
server 192.168.10.129:5000;
}
server {
listen 80;
server_name www.stest.com;
location / {
proxy_pass http://test;
}
}
9、用户通过输入域名,经DNS域名解析访问到nginx代理机,然后前端的代理机将web请求代理到后端的真实服务器上
10、通过日志文件查看项目进展情况
五、项目成果:
实现nginx反向代理
实现多台nginx之间的负载均衡,利用keepalived提高了可用性
实现nfs挂载