技术源码

nginx+keepalived的负载均衡、高可用web集群


软件环境
CentOS:CentOS Linux release 7.9.2009 (Core)
Nginx:nginx/1.23.3
Ansible:ansible 2.9.27
Keepalived: Keepalived v1.3.5 (03/19,2017)
NFS: nfs v4

项目描述
简介
模拟企业构建一个高可用并且高性能的web集群项目,能处理大并发的web业务。使用Ansible实现软件环境的部署,Nginx实现7层负载均衡和搭建web框架,Keepalived搭建双vip架构实现高可用,Prometheus+Grafana实现对web集群以及负载均衡器的系统资源监控,NFS实现web集群的数据同源,DNS搭建主域名服务器实现vip地址的解析。

负载均衡服务器fz1 192.168.1.10
负载均衡服务器fz2 192.168.1.11
ansible 192.168.1.12
web01 192.168.1.15
web02 192.168.1.16
web03 192.168.1.17
nfs 192.168.1.30

统一用户名密码root/wsn123


1,进入ansible-192.168.1.12主机安装ansible环境

[root@ansible ~]# yum install -y epel-release #安装epel源
[root@ansible ~]# yum install -y ansible #安装ansible
[root@ansible ~]# ansible --version #查看ansible版本

2,编写host inventory(主机清单)–要远程控制的主机ip

配置文件/etc/ansible/hosts

[root@ansible ansible]# vim /etc/ansible/hosts
[fz]
192.168.1.10
192.168.1.11
[nfs_server]
192.168.1.30
[web_servers]
192.168.1.15
192.168.1.16
192.168.1.17
[all:vars]
ansible_user=root
ansible_ssh_pass=wsn123

3,编写playbook批量部署nginx、keepalived

- hosts: web_servers #web集群
  remote_user: root
  tasks:
  #web主机组中编译安装部署nginx集群
  - name: install nginx
    script:  ./one_key_install_nginx.sh #调用本地一键安装部署nginx脚本,在远程主机上编译安
装
    #web主机组中安装nfs,访问nfs服务器,实现数据同源
  - name: install nfs
    yum: name=nfs-utils state=installed

- hosts: fz #负载均衡服务器
  remote_user: root
  tasks:
    #fz主机组中编译安装nginx
  - name: install nginx
    script:  ./one_key_install_nginx.sh
    #fz主机组中安装keepalived,实现高可用
  - name: install keepalived
    yum: name=keepalived state=installed
- hosts: nfs_server #NFS服务器
  remote_user: root
  tasks:
  - name: install nfs
    yum: name=nfs-utils state=installed

一键安装部署nginx脚本

[root@ansible bz]# vim one_key_install_nginx.sh

mkdir -p /my_nginx
cd /my_nginx

# 下载nginx压缩包
curl -O http://nginx.org/download/nginx-1.23.3.tar.gz
# 或者用wget
#wget http://nginx.org/download/nginx-1.23.3.tar.gz
# 解压
tar xf nginx-1.23.3.tar.gz
# 进入文件夹
cd nginx-1.23.3

# 新建用户,用于启动nginx进程,名字自拟
useradd -s /sbin/nologin mynginx99

# 安装依赖包
# ssh相关、gcc为编译需要、pcre正则相关、make编译相关
yum install -y openssl openssl-devel gcc pcre pcre-devel automake make net-tools vim

# configure是一个配置的脚本文件,会根据指定的配置生成一个Makefile文件,这个文件会影响后面make命令的编译,相当于图纸
# configure可配置参数可以参考官方文档:http://nginx.org/en/docs/configure.html
# 常用选项:
# --with-*:开启某个功能,默认不安装	--without-*:禁用某个功能,默认安装
# --prefix=path:指定路径			--conf-path=path:指定配置文件路径,不指定会放到prefix路径下
# --user=name:指定启动nginx worker进程的用户
# --with-http_ssl_moudle 开启https的功能,下载ssl来进行公钥和私钥的认证
# --without-http——memcached_moudle 禁用http_memcached
# --with-http_realip_module 启用realip功能,让后端知道通过代理访问的用户的ip
# --with-http_v2_module:对http2.0版本的支持
# --with-threads:开启线程池功能		--with-http_stub_status_moudle:开启nginx状态统计功能,可以知道多少访问
# --with-stream 支持tcp/udp反向代理,即4层负载均衡
./configure --prefix=/usr/local/mynginx99 --user=mynginx99 --with-http_ssl_module --with-http_realip_module --with-http_v2_module --with-threads --with-http_stub_status_module --with-stream

# 编译
# make是按照Makefile的配置去编译程序为二进制文件,二进制文件就是执行可以运行的程序
# -j:指定编译进程数,多点速度快些,可以使用top后按1查看虚拟机配有几个核心
make -j2 
# 将编译好的二进制文件复制到指定安装路径目录下
make install

# 启动nginx
/usr/local/mynginx99/sbin/nginx

# 修改PATH变量
PATH=$PATH:/usr/local/mynginx99/sbin
echo "PATH=$PATH" >>/root/.bashrc

# 设置nginx的开机启动,rc.local是指向rc.d/rc.local的链接,后者需要拥有执行权限才能开机自启
echo "/usr/local/mynginx99/sbin/nginx" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local

# selinux和firewalld防火墙都关闭
# selinux临时和永久关闭
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config

# 防火墙临时和永久关闭
service firewalld stop
systemctl disable firewalld

4,模拟中台转发系统,两台负载均衡器上使用nginx实现7层负载均衡,后端nginx集群通过访问NFS服务实现数据同源。

负载均衡的实现

在两台负载均衡器(fz1、fz2)上编辑nginx配置文件,增加负载均衡的功能

[root@fz1 conf]# vim /usr/local/mynginx99/conf/nginx.conf

#使用7层负载均衡
    upstream my_lb {
        server 192.168.1.15; #web1     
        server 192.168.1.16; #web2     
        server 192.168.1.17; #web3     
 }
    server {
        listen       80;
        server_name  localhost;
        #转发到后端服务器 
        location / {
                proxy_pass http://my_lb;
        }

5,nfs服务器编辑共享文件

[root@nfs ~]# cat /etc/exports
/web 192.168.1.0/24(ro,all_squash,async)

创建共享出去的文件夹

[root@nfs ~]# mkdir /web
[root@nfs web]# cd /web
[root@nfs web]# touch index.html
[root@nfs web]# ls
index.html
[root@nfs web]# cat index.html 
www.wsnfree.top

刷新配置文件

[root@nfs web]# systemctl restart nfs
[root@nfs web]# exportfs -rv
exporting 192.168.1.0/24:/web

所有web集群挂载使用共享目录

mount 192.168.1.30:/web /usr/local/mynginx99/html/

刷新页面,仍然访问www.wsnfree.top,实现了数据一致性

6,使用nginx的https、隐藏版本、身份认证、realip等模块

https模块/http自动跳转到https

上传域名绑定的ssl证书到/usr/local/mynginx99/conf/下

阿里云上购买域名可以免费申请ssl证书

编辑nginx配置文件

[root@lb1 conf]# vim /usr/local/mynginx99/conf/nginx.conf
     #HTTPS server

    server {
        listen       443 ssl;
        server_name  www.chenlb666.top; #域名

        ssl_certificate      9560502_chenlb666.top.pem; #私钥
        ssl_certificate_key  9560502_chenlb666.top.key; #公钥

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
                proxy_pass http://my_lb;
                proxy_set_header X-Real-IP $remote_addr;
        }
    }

实现http自动跳转到https
server{}中加入

return 301 https://www.chenlb666.top;


隐藏版本
负载均衡器上编辑nginx配置文件

server_tokens off; #nginx.conf配置文件中的http{}中加入


7,在负载均衡器上使用keepalived搭建双vip双master高可用架构

安装部署(已使用playbook批量安装完成)

两个负载均衡器上启用两个arrp实例

fz1

! 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
}

#定义监控脚本chk_nginx
vrrp_script chk_nginx {
        #判断nginx是否在运行,若服务已挂,则返回值为1,执行下面的命令,使其priority值减80,小于backup的priority的值,使其成为backup状态
        script "/etc/keepalived/check_nginx.sh"
	interval 1
	weight -80
}

vrrp_instance VI_1 {
    state MASTER #设置为MASTER角色
    interface ens33 #收听vrrp广播的网卡为ens33
    virtual_router_id 88 #虚拟路由器id
    priority 150 #优先级,MASTER
    advert_int 1 #vrrp广播延迟
    authentication {
        auth_type PASS 
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.55 #vip地址
    }
#调用监控脚本
track_script {
	chk_nginx
}
#定义notify_backup,如果本机负载均衡器lb1的nginx挂了,就关闭keepalived
notify_backup "/etc/keepalived/stop_keepalived"
}

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 99
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.56
    }
}

fz2

! 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
}
#定义监控脚本chk_nginx
vrrp_script chk_nginx {
	#判断nginx是否在运行,若服务已挂,则返回值为1,执行下面的命令,使其priority值减80,小于backup的priority的值,使其成为backup状态
	script "/etc/keepalived/check_nginx.sh"
	interval 1
        weight -80

}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 88
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.55
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 99
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.56
    }
#调用监控脚本
track_script {
	chk_nginx
}
#定义notify_backup,如果本机负载均衡器lb2的nginx挂了,就关闭keepalived
notify_backup "/etc/keepalived/stop_keepalived"
}

外部check_nginx.sh判断nginx是否挂了的脚本

[root@fz2 keepalived]# cat check_nginx.sh 
#!/bin/bash
if /usr/sbin/pidof nginx &>/dev/null;then
	exit 0
else
	exit 1
fi

记得给脚本chmod +x check_nginx.sh增加可执行权限
master实例调用监控脚本

#调用监控脚本
track_script {
	chk_nginx
}

外部关闭keepalived脚本:

[root@fz2 keepalived]# cat stop_keepalived 
#!/bin/bash
service keepalived stop

1.提前规划好整个集群的架构,可以提高项目开展时效率。
2.对基于Nginx的web集群和高可用、高性能有了深入的理解,同时对脑裂和vip漂移现象也有了更加深刻的体会和分析。
3.加强了对7层负载均衡和dns负载均衡的认识
4.认识到了系统性能资源的重要性,对压力测试下整个集群的瓶颈有了一个整体概念。

Prev Next
No Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注