一般情况下,为了提升后台服务性能扩充及高可用,前端用一个nginx做反向代理即可
但是,作为互联网项目,纯2C的话必然需要做整体的高可用,不仅后台服务有N个,Nginx同样需要有N个,一主N备,当有一个服务器挂掉的时候,服务能瞬间切换到其他服务器,保证前台服务的高可用
下面就以上图为例,说明一下如何实现server的高可用。
1、准备
虚拟机两台,同样安装nginx,keepalived
2、修改nginx首页,启动nginx
简单起见,我们认为每个nginx都是代理一个服务,只用静态页作为测试
页面内容为”Welcome to 192.168.70.71″和“Welcome to 192.168.70.72”
/opt/web/index.html
<DOCTYPE html>
<html>
<head>
<title>页面标题</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
* {
box-sizing: border-box;
}
/* body 样式 */
body {
font-family: Arial;
margin: 0;
font-size: 60px;
}
/* 标题 */
.header {
padding: 30px;
text-align: left;
background: #1abc9c;
color: white;
}
/* 标题字体加大 */
.header h1 {
font-size: 60px;
}
</style>
</head>
<body>
<div class="header">
<h1>keepalived负载均衡测试</h1>
<p> welcome to 192.168.70.71</p>
</div>
</body>
</html>
/etc/nginx/nginx.conf
server {
listen 80;
server_name 192.168.70.75;
location / {
root /opt/web;
index index.html;
autoindex on;
}
启动nginx
systemctl start nginx
3、修改keepalived的配置文件
主配置如下(默认配置文件:/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_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2 ## 检测时间间隔
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface enp0s3
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx ## 执行 Nginx 监控的服务
}
virtual_ipaddress {
192.168.70.75
}
}
从机配置(默认配置文件:/etc/keepalived/keepalived.conf)
! Configuration File for keepalived
global_defs {
# smtp_connect_timeout 30
router_id LVS_BAK
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2 ## 检测时间间隔
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx ## 执行 Nginx 监控的服务
}
virtual_ipaddress {
192.168.70.75
}
}
3、编写监测心跳脚本
上面配置中可以看到有一个脚本文件:/etc/keepalived/nginx_check.sh
查看nginx是否启动,如果没启动则启动,如果启动不起来,停掉keepalived服务,此时心跳断掉,服务转向另一个nginx。
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl start nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/etc/init.d/keepalived stop
fi
fi
4、测试
启动192.168.70.71上的nginx和keepalive
启动192.168.70.72上的nginx和keepalive
访问虚拟IP:http://192.168.70.75
停掉192.168.70.71上的keepalive
rk,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlb25zdTIwMTk=,size_16,color_FFFFFF,t_70)
重新启动192.168.136.2上的keepalive,又会回到 Welcome to 192.168.70.71