软件环境
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.认识到了系统性能资源的重要性,对压力测试下整个集群的瓶颈有了一个整体概念。
No Comments