项目名称: 基于nginx的双vip集群
项目环境:centos7服务器、nginx-1.23.3、Keepalived v1.3.5、prometheus-2.42.0、nfs、bind
项目描述:模拟企业构建一个web集群,并且达到高可用、负载均衡的效果,可以处理大规模的业务
项目步骤:
1.准备三台backend,并修改为静态IP,并更改主机名。
web-1 192.168.118.151
web-2 192.168.118.152
web-3 192.168.118.153
nfs 192.168.118.131##这里选择static IP是为了固定ip,防止IP变动影响实验
yum install epel-release -y #安装epel源,更好的下载软件
yum install vim wget -y #安装vim、wget便于后续操作
wget http://mirrors.aliyun.com/repo/Centos-7.repo# 安装阿里源,下载软件更快速
2.使用脚本安装nginx,开启模块
##利用脚本安装nginx,在多台机器上更快部署
#!/bin/bash
mkdir -p /nginx_web
cd /nginx_web
useradd panlinfeng -s /sbin/nologin
#创建启动用户,防止登录
curl -O http://nginx.org/download/nginx-1.23.3.tar.gz
#下载nginx镜像
tar xf nginx-1.23.3.tar.gz
#解压tar包
yum install gcc openssl openssl-devel pcre pcre-devel automake make -y
#安装依赖环境
cd nginx-1.23.3
./configure --prefix=/usr/local/plfnginx --user=panlinfeng --with-http_ssl_module --with-http_stub_status_module --with-stream --with-http_v2_module
#安装nginx指定目录/usr/local/plfnginx、指定启动worker用户panlinfeng、
#分别开启https、状态统计、流、支持http2.0模块
make -j 2
#启用两个job来编译
make install
#编译安装
/usr/local/plfnginx/sbin/nginx
#启动nginx服务
PATH=$PATH:/usr/local/plfnginx/sbin
#加入PATH路径
echo "PATH=$PATH:/usr/local/plfnginx/sbin" >>/root/.bashrc
#永久加入PATH
echo "/usr/local/plfnginx88/sbin/nginx" >>/etc/rc.local
#开机自启动nginx
chmod +x /etc/rc.d/rc.local
#开机启动文件增加可执行权限
systemctl stop firewalld
#关闭防火墙防止被阻挡
systemctl disable firewalld
#永久关闭防火墙
setenforce 0
#临时设置selinux为disabled
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
#永久设置selinux为disabled
最后执行一键安装脚本
bash one_key_nginx.sh
最后查看nginx是否启动成功
[root@web-1 nginx]# bash one_key_nginx.sh ^C [root@web-1 nginx]# ps aux|grep nginx root 2186 0.0 0.0 46220 1164 ? Ss 18:34 0:00 nginx: master process /usr/local/plfnginx/sbin/nginx panlinf+ 2187 0.0 0.1 47104 2932 ? S 18:34 0:02 nginx: worker process panlinf+ 2188 0.0 0.1 47104 2860 ? S 18:34 0:02 nginx: worker process panlinf+ 2189 0.0 0.1 47104 2852 ? S 18:34 0:03 nginx: worker process root 3136 0.0 0.0 112812 968 pts/0 S+ 19:44 0:00 grep --color=auto nginx
3.启动nfs,实现数据的一致性
3.1.搭建好nfs服务器:每台机器都要做
在做nfs机器上,依次执行:yum install nfs-utils -y
service nfs restart
3.2.编辑配置
[root@nfs ~]# cat /etc/exports /web/nginx 192.168.118.0/24(all_squash,rw,sync)
#/web/nginx 设置共享的目录#192.168.118.0/24 允许访问nfs的网段
#all_squash不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户, 同时它的UID和GID都会变成nfsnobody帐号身份。 ro 用户只有可读的权限, sync请求或写入数据时,数据同步写入到NFS Server的硬盘
mkdir /web/nginx -p vim index.html echo "hello panlinfeng ,i am nginx" >index.html
新建共享目录,实现数据的一致性
3.3.刷新nfs
exportfs -av
3.4.在backend server上进行挂载
mount 192.168.118.131:/web/nginx /usr/local/plfnginx/html并用df 查看是否挂载成功
[root@web-1 nginx]# mount 192.168.118.131:/web/nginx /usr/local/plfnginx/html [root@web-1 nginx]# df -Th Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 898M 0 898M 0% /dev tmpfs tmpfs 910M 0 910M 0% /dev/shm tmpfs tmpfs 910M 9.6M 901M 2% /run tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup /dev/mapper/centos-root xfs 17G 2.0G 16G 12% / /dev/sda1 xfs 1014M 151M 864M 15% /boot tmpfs tmpfs 182M 0 182M 0% /run/user/0 192.168.118.131:/web/nginx nfs4 17G 6.4G 11G 38% /usr/local/plfnginx/html
3.5.在浏览器上查看三个IP对应相同的内容
数据一致,说明nfs搭建,启动成功
[root@web-1 html]# cat /usr/local/plfnginx/html/index.html hello panlinfeng ,i am nginx
[root@web-2 ~]# mount 192.168.118.131:/web/nginx /usr/local/plfnginx/html [root@web-2 ~]# cat /usr/local/plfnginx/html/index.html hello panlinfeng ,i am nginx
[root@web-3 ~]# mount 192.168.118.131:/web/nginx /usr/local/plfnginx/html [root@web-3 ~]# cat /usr/local/plfnginx/html/index.html hello panlinfeng ,i am nginx
4.搭建双vip的负载均衡高可用系统
4.1.负载均衡器上都需要安装nginx,使用nginx做7层负载均衡,安装keepalived软件,在2台机器。
yum install -y keepalived
4.2.修改配置文件
cd /etc/keepalived/
vrrp_instance VI_1 { #实例1 state MASTER #主服务器 interface ens33 #接口 ens33 virtual_router_id 51 #虚拟路由id 验证身份属于哪个组 priority 100 #优先权 100 权值越大 就为主服务器 advert_int 1 #发宣传间隔 authentication { #认证消息 auth_type PASS #认证类型 密码 auth_pass 1111 #密码 1111 } virtual_ipaddress { #对外公开访问ip 192.168.118.111 } } vrrp_instance VI_2 { #实例2 state BACKUP #备服务器 interface ens33 virtual_router_id 52 #id 52 属于另外一个组 priority 80 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.118.222 #对外公开ip } }
vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 80 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.118.111 } } vrrp_instance VI_2 { state MASTER interface ens33 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.118.222 } }
4.3.刷新服务systemctl restart keepalived
查看IP地址,分别出现两个ip,其中一个为虚拟ip
[root@keepalived-1 ~]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:bd:c2:59 brd ff:ff:ff:ff:ff:ff inet 192.168.118.154/24 brd 192.168.118.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.118.111/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::351c:a12c:1f58:4322/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever inet6 fe80::268:66d3:afd4:adf6/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever inet6 fe80::75c3:a1c8:9b82:f665/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever [root@keepalived-1 ~]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:bd:c2:59 brd ff:ff:ff:ff:ff:ff inet 192.168.118.154/24 brd 192.168.118.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.118.111/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::351c:a12c:1f58:4322/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever inet6 fe80::268:66d3:afd4:adf6/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever inet6 fe80::75c3:a1c8:9b82:f665/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever
4.4.验证双vip服务是否执行成功
分别关闭一台keepalived,查看虚拟ip,出现三个ip地址,证明验证成功
inet 192.168.118.154/24 brd 192.168.118.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.118.111/32 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.118.222/32 scope global ens33 valid_lft forever preferred_lft forever
inet 192.168.118.155/24 brd 192.168.118.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.118.222/32 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.118.111/32 scope global ens33 valid_lft forever preferred_lft forever
5.搭建自己主域名的DNS服务(192.168.118.156)。
5.1.安装软件bind
yum install bind* -y
5.2.设置named服务开机启动,并且立马启动DNS服务
name daemon -->named提供域名服务的进程的名字
守护进程:一直在内存里运行,除非人为停止systemctl start named #开启
systemctl enable named #设置开机自启
ps aux |grep named #监听53端口5.3.修改配置文件,重启服务器允许其他电脑能过来查询dns域名
vim /etc/named.conf
listen-on port 53 { any; }; #ipv4监听端口和ip地址,默认只有本地的
listen-on-v6 port 53 { any; }; #ipv6监听端口和ip地址,默认只有本地的
allow-query { any; } #查询范围允许所有网段查询。
5.4.修改次配置文件,告诉named为panlinfeng.top提供域名解析vim /etc/named.rfc1912.zones
zone "panlinfeng.top" IN {
type master;
file "panlinfeng.top.conf";
allow-update { none; };
};#添加上面的配置,建议在localhost后面。
5.5./var/named/ 存放dns域名解析的数据文件--》创建panlinfeng.top.conf的数据文件
cp named.localhost panlinfeng.top.conf -a
-a 原来的配置不变
增加这两条DNS负载均衡记录
www A 192.168.118.111 #虚拟ip地址1
www A 192.168.118.222 #虚拟ip地址2
刷新服务
systemctl restart named
域名设置成功
6.启动prometheus进行监控
6.1.下载promethrus软件,去官网然后解压
tar -xf prometheus-2.42.0.linux-amd64.tar.gz
6.2.放到指定目录,增加到PATH变量里,并永久修改
PATH=/pro/prometheus/:$PATH
echo "PATH=/pro/prometheus/:$PATH" >>/root/.bashrc
6.3.放到后台运行
nohup prometheus --config.file=/pro/prometheus/prometheus.yml &
netstat -anplut|grep prometh 查看prometheus监听9090端口
6.4.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
6.5.进行访问
192.168.118.157:9090
6.6.把prometheus做成一个服务(service)来进行管理,非常方便
vim /usr/lib/systemd/system/prometheus.service
[Unit]
Description=prometheus
[Service]
ExecStart=/pro/prometheus/prometheus --config.file=/pro/prometheus/prometheus.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload 重新加载配置
6.7.在node节点服务器上安装exporter程序,并解压
cd node_exporter-1.5.0.linux-amd64/
6.8.修改PATH变量
PATH=/exporter/node_exporter/:$PATH
永久修改 vim /root/.bashrc
6.9.执行node exporter代理程序
#先判断端口是否冲突
netstat -anplut |grep 8090
nohup node_exporter --web.listen-address 0.0.0.0:8090 &
放到后台运行
访问node节点上的metrics
192.168.118.151:8090192.168.118.152:8090
192.168.118.153:8090
6.11.在prometheus服务器上添加抓取数据的配置,添加node节点服务器,
将抓取的数据存储到时序数据库里
vim prometheus.yml
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
#采集exporter1机器的指标
- job_name: "my_exporter1"
static_configs:
- targets: ["192.168.118.151:8090"]
- job_name: "my_exporter2"
static_configs:
- targets: ["192.168.118.152:8090"]
- job_name: "my_exporter3"
static_configs:
- targets: ["192.168.118.153:8090"]
6.12重启prometheus服务,访问prometheus
systemctl restart prometheus
7.启动grafana,更好的监控metrics
7.1.下载并安装
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.3-1.x86_64.rpm
sudo yum install grafana-enterprise-9.4.3-1.x86_64.rpm -y
7.2.启动grafana
systemctl start grafana-serversystemctl enable grafana-server
监听的端口是3000端口
7.3.登录
192.168.118.157:3000
默认的账户密码是
admin
改为plf123456
7.4.导入grafana的模板
https://grafana.com/grafana/dashboards
8.对nginx和linux内核的参数进行优化
8.1.worker_processes worker_processes指定Nginx的工作进程数量。
应该设置参数为可用CPU核心的数量。
worker_processes 3;
8.2.worker_connections worker_connections指定每个工作进程可以同时处理的最大连接数。
如果连接数达到此限制,Nginx将拒绝新的连接。
worker_connections 2048;
8.3.gzip启用压缩。启用该选项,则Nginx将自动压缩输出,从而减少网络带宽。
gzip on;
8.4.开启nginx缓存功能
8.5.关于系统连接数的优化,查看当前的最大打开文件数
ulimit -n 99999
8.6.Linux内核参数优化
vim /etc/sysctl.conf #修改内核参数文件
添加:
net.core.netdev_max_backlog = 262144 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目
net.core.somaxconn = 262144 #调节系统同时发起的TCP连接数
net.ipv4.tcp_max_orphans = 262144 #设定系统中最多允许存在多少tcp套接字不被关联到任何一个用户文件句柄上
net.ipv4.tcp_max_syn_backlog = 262144 #记录的那些尚未收到客户端确认信息的连接请求的最大值
net.ipv4.tcp_tw_recycle = 1 #开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_tw_reuse = 1 #允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_syncookies = 0 #当出现SYN等待队列溢出时,禁用cookies来处理
net.ipv4.tcp_synack_retries = 1 #设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数量
net.ipv4.tcp_ack_retries = 1 #该参数的作用与上一个参数类似,设置内核放弃建立连接之前发送SYN包的数量sysctl -p #执行操作
9.使用ab软件对整个web集群进行压力测试,了解整个集群的并发连接数
9.1.ab的安装
yum -y install httpd-tools
ab -c 1000 -n 5000 http://www.panlinfeng.top/ 同时处理1000个请求并运行5000次