基于nginx的web集群

项目环境

centos7.95台、nginx、nfs、keepalived、Prometheus

项目描述

构建了一个基于nginx的负载均衡项目,通过keepalived实现了高可用,使用Prometheus监控两台负载均衡器
在这里插入图片描述

准备工作

先准备四台真实的机器,分别作为负载均衡器1(LB1)、负载均衡器2(LB2)、后端服务器1(web1)、后端服务器2(web2),还有一台搭建nfs+Prometheus,
前四台都需要安装nginx。
nginx的安装可以对照的官方文档,装完一个写一个脚本,后面三台都可以一键安装,或者是装完一台直接克隆三台
nginx脚本

#!/bin/bash

# 新建文件夹用来下载nginx源码包
mkdir -p /nginx
cd /nginx

# 新建用户
useradd  -s /sbin/nologin nginx

# 下载nginx
# 推荐下载好后直接传到机器里,然后直接解压
# curl -O https://nginx.org/download/nginx-1.23.4.tar.gz

# 解压nginx
tar xf nginx-1.23.4.tar.gz

# 解决依赖关系
yum install gcc -y
yum install openssl openssl-devel pcre pcre-devel automake make -y

# 编译前的配置
cd nginx-1.23.4

./configure --prefix=/usr/local/my_nginx  --user=nginx --with-http_ssl_module  --with-http_v2_module  --with-threads  --with-http_stub_status_module  --with-stream

# 编译,开启两个进程同时开始
make -j 2

# 安装,将编译好的二进制文件复制到指定的文件目录下
make install

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

# 设置开机自启
echo "/usr/local/my_nginx/sbin/nginx" >>/root/.bashrc
chmod +x /etc/rc.d/rc.local

# selinux和firewalld防火墙都关闭
systemctl stop firewalld

# 临时关闭
# setenforce 0
# 永久
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config

实现负载均衡

准备四台服务器,两台做负载均衡器,另外两台做web服务器,都建议编译安装nginx(由于是dhcp服务的,所以ip地址可能会发生变化)
三种实现负载均衡的方式(https://nginx.org/en/docs/http/load_balancing.html)
1.轮询
2.最小连接
3.ip-hash
LB1:192.168.1.22
LB2:192.168.1.19
WEB1:192.168.1.20
WEB2:192.168.1.26

修改LB1和LB2的配置文件(修改前可以先备份一份)

http {
	...
	...
	    upstream myapp1 {
        # least_conn;
        server 192.168.1.26 weight=3;
        server 192.168.1.20 weight=2;
    }
    ...
    ...
	server {
		location / {
            #root   html;
            #index  index.html index.htm;
            proxy_pass http://myapp1;
            # 这里添加了一个真实的ip,添加之后能在日志中看到用户访问的ip,在log_fiemat中添加 - $HTTP_X_REAL_IP
            proxy_set_header X-Real-IP $remote_addr;
        }
	}
}

使用nginx -s reload刷新配置
在LB2中也类似设置

修改web1和web2的html,便于测试

# web1
<h1>this is web1</h1>
# web3
<h1>this is web2</h1>

在浏览器中输入对应的两个负载均衡器的地址(192.168.1.22,192.168.1.19)
在这里插入图片描述
在这里插入图片描述

使用keepalived实现高可用

在两台负载均衡器上安装keepalived

yum install keepalived -y

修改配置文件

vim /etc/keepalived/keepalived.conf

配置LB1配置文件

vrrp_instance VI_1 {
    state MASTER	# 做master角色
    interface ens33		# 指定监听网络的端口
    virtual_router_id 112	# 虚拟路由器id	0~255
    priority 120	# 优先级 0~255
    advert_int 1	# 宣告消息的时间间隔
    authentication {
        auth_type PASS	# 密码认证
        auth_pass 1111	# 具体密码
    }
    virtual_ipaddress {		# 虚拟ip地址
        192.168.1.188
    }
}

LB2类型上面步骤,配置文件

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

可以看到,在LB1上出现了VIP
在这里插入图片描述
停掉LB1的nginx
在这里插入图片描述
可以发现,VIP已经消失了,在去LB2中查看一下ip地址
在这里插入图片描述
可以看到,LB2上出现了VIP,证明keepalive设置成功
编写脚本检查LB是否挂掉,如果挂掉,就重新开启,如果没有开启成功,就实现vip漂移
思路:只需要检测nginx是否讯息就可以了可以通过nginx的pid是否存在

#!/bin/bash
# 检测nginx是否正常运行
if /usr/sbin/pidof nginx &>/dev/null ;then
	exit 0
else
	exit 1
fi

在LB1的keepalived配置文件中修改

# 定义监控脚本
vrrp_script chk_nginx {
   script "/nginx_sh/check_nginx.sh"
   interval 1
   weight -30
}

vrrp_instance VI_1 {
...
# 调用监控脚本
    track_script {
        chk_nginx
    }
...
}

监控和nfs

这里监控和nfs放在了一台机器上,使用docker搭建了Prometheus服务器,ip为192.168.1.17

搭建nfs

安装nfs

yum install nfs-utils -y

启动nfs服务,两条都可以

service nfs restart
service nfs-server restart
# 新建共享目录
mkdir -p /web

编辑共享配置文件(vim /etc/exports)

# 共享/web出去允许192.168.1.0/24这个网段的机器来访问,只有只读的权限
/web 192.168.1.0/24(ro,all_squash,sync)
# rw 可读可写
# ro 只能读
# all_squash 任何人访问都当作为普通用户
# root_squash 任何人访问都当作为root用户
# no_root_squash 当
# sync 同步	同时将数据写入到磁盘
# async 异步	先保存在磁盘中,然后再写入

输出当前主机中NFS服务器所有的共享目录

exportfs -av
# exporting 192.168.1.0/24:/web

编辑共享文件夹

vim index.html
# this is nfs server

在两台后端服务器上(web1和wen2上挂载)

mount 192.168.1.17:/web /usr/local/my_nginx/html
# 查看
df -h

如果挂载不成功,关闭防火墙

结果
在这里插入图片描述
在这里插入图片描述

安装Prometheus

需要先安装docker(因为现在centos已经不更新了,所以docker的界面上找不到centos的安装,这里直接给出安装步骤)

# 卸载之前的版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce

# 安装gcc 
yum -y install gcc	
yum -y install gcc-c++

# 安装yum工具
yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

# 设置stable镜像地址
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

# 更新yum包软件索引
yum makecache fast

# 安装docker
yum -y install docker-ce docker-ce-cli containerd.io

# 启动docker
systemctl start docker

# 查看版本
docker version

# 常用命令
systemctl daemon-reload //重载系统服务
systemctl list-unit-files --type service //查看全部服务命令
systemctl status docker  // 查看docker服务状态
systemctl enable docker //设置docker开机自启动
systemctl disable docker // 关闭docker开机启动
systemctl start docker // 启动docker服务
systemctl stop docker // 停止docker服务
systemctl restart docker // 重启docker服务

# 配置镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://qlmy5iw9.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

# 测试
docker run hello-world

拉取镜像

docker pull prom/prometheus

部署(这里先把容器中的配置文件给拷贝出来,然后通过挂载实现容器和宿主机之间的互通)

docker run -d --name prometheus prom/prometheus
docker cp prometheus:/etc/prometheus /prom
# 记得删除容器
docker run -d --name prometheus -p 9090:9090 -v /prom:/etc/prometheus prom/prometheus

开放端口(每一步都要做,下面就不演示了)
firewall-cmd --zone=public --add-port=9100/tcp --permanent
firewall-cmd --reload
测试,浏览器输入本机地址+端口号
在这里插入图片描述
安装node-exporter

拉取镜像

docker pull prom/node-exporter
docker run -d --name node-exporter -p 9100:9100 -v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" --net="host" prom/node-exporter

修改Prometheus.yml配置文件

- job_name: 'node-exporter'
  static_configs:
  - targets: ['192.168.1.17:9100']
    labels:
       instance: node-exporter

测试,浏览器输入本机地址+端口号
在这里插入图片描述
安装grafana
拉取镜像

docker pull grafana/grafana

安装

docker run -d --name=grafana -p 3000:3000 -v /grafana:/var/lib/grafana grafana/grafana

浏览器测试(默认的账号和密码都是admin),这里直接跳到最后一步了,推荐几个还行的模板,模板id:1860 8919(中文)

安装cadvisor
拉取镜像

docker pull google/cadvisor

安装
注意google/cadviso目前国内下载不了,有需要的可以直接下载链接: 链接: https://pan.baidu.com/s/1JpuaCti-MeqlokrMZqazxw?pwd=tyy1

docker run -d \
--name=cadvisor \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/cgroup:/cgroup:ro \
--publish=9595:8080 \
--detach=true \
--privileged=true \
google/cadviso

浏览器测试
在这里插入图片描述
到此结束

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值