构建一个基于nginx的web集群项目
一、什么是负载均衡?
负载均衡: 将用户的访问请求均衡的分散到后端的真正提供服务的机器上
负载均衡器: 实现负载均衡功能的一个机器
load balancer --》LB
load balancing
二、为什么需要负载均衡?
1.能够将大量的请求比较均匀的分散到后端,不会导致某台访问量过大,某个服务又没有访问量
2.高可用(对后端的服务器进行健康检测,如果后端那台服务器出现问题,就不会再将请求转发给它,从而避免用户访问不了服务器,启动一个容错的功能)
[root@mysql-server ~]# hostnamectl set-hostname load-balancer
[root@mysql-server ~]# su
[root@load-balancer ~]#
nginx 来实现负载均衡功能
nginx是一个web服务器,可用实现http功能,但是它也可以对http访问进行负载均衡
1.编译安装nginx
[root@load-balancer ~]# cat onekey_install_shediao_nginx_v10.sh
#!/bin/bash
2.解决软件的依赖关系,需要安装的软件包
yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake make psmisc net-tools lsof vim wget
3.新建luogan用户和组
id sanchuang || useradd sanchuang -s /sbin/nologin
4.下载nginx软件
mkdir /sanchuang99 -p
cd /sanchuang99
wget http://nginx.org/download/nginx-1.21.1.tar.gz
5.解压软件
tar xf nginx-1.21.1.tar.gz
#进入解压后的文件夹
cd nginx-1.21.1
6.编译前的配置
./configure --prefix=/usr/local/scsanchuang99 --user=sanchuang --group=sanchuang --with-http_ssl_module --with-threads --with-http_v2_module --with-http_stub_status_module --with-stream
7.如果上面的编译前的配置失败,直接退出脚本
if (( $? != 0));then
exit
fi
#编译
make -j 2
#编译安装
make install
#修改PATH变量
echo "PATH=$PATH:/usr/local/scsanchuang99/sbin" >>/root/.bashrc
#执行修改了环境变量的脚本
source /root/.bashrc
#firewalld and selinux
#stop firewall和设置下次开机不启动firewalld
service firewalld stop
systemctl disable firewalld
#临时停止selinux和永久停止selinux
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
8.开机启动
chmod +x /etc/rc.d/rc.local
echo "/usr/local/scsanchuang99/sbin/nginx" >>/etc/rc.local
9.运行安装脚本
[root@load-balancer ~]# bash onekey_install_shediao_nginx_v10.sh
[root@load-balancer ~]# su - root 切换用户,加载修改了的PATH变量
上一次登录:二 8月 24 11:26:16 CST 2021pts/2 上
[root@load-balancer ~]# which nginx 查看nginx的命令
/usr/local/scsanchuang99/sbin/nginx
[root@load-balancer ~]# nginx 启动nginx
[root@load-balancer ~]# nginx -s stop 关闭nginx
[root@load-balancer ~]# nginx 启动nginx
[root@load-balancer ~]# ps aux|grep nginx 查看nginx的进程
root 7569 0.0 0.0 46220 1160 ? Ss 11:28 0:00 nginx: master process nginx
sanchua+ 7570 0.0 0.1 46680 1912 ? S 11:28 0:00 nginx: worker process
root 7572 0.0 0.0 112824 980 pts/2 S+ 11:29 0:00 grep --color=auto nginx
[root@load-balancer ~]# ss -anplut|grep nginx 查看nginx的端口
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=7570,fd=6),("nginx",pid=7569,fd=6))
[root@load-balancer ~]#
10.配置nginx里的负载均衡功能
[root@load-balancer ~]# cd /usr/local/scsanchuang99/ 进入nginx编译安装指定的目录
[root@load-balancer scsanchuang99]# ls
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
[root@load-balancer scsanchuang99]# cd conf/ 进入配置文件的命令
[root@load-balancer conf]# ls
fastcgi.conf fastcgi_params.default mime.types nginx.conf.default uwsgi_params
fastcgi.conf.default koi-utf mime.types.default scgi_params uwsgi_params.default
fastcgi_params koi-win nginx.conf scgi_params.default win-utf
[root@load-balancer conf]#
nginx.conf 是nginx的配置文件
[root@load-balancer conf]# vim nginx.conf
upstream 上游-->实现负载均衡的指令
proxy 代理
pass 通过
⚠️附赠一个学习的网址哈☝️:
nginx.org
三、负载均衡的算法(方法)
1.轮询
roundrobin --》rr --》默认,默认情况下所有的服务器的权重值都是1 ,值越大优先级越好
加权轮询
server 192.168.0.17 weight=1;
server 192.168.0.18 weight=2;
server 192.168.0.19;
server 192.168.0.7;
2.ip_hash 基于客户端的ip地址
ip_hash 基于客户端的ip地址做负载均衡,相同的ip地址转发到同一个服务器 --》用户的会话信息需要保存的,尽量让这个客户机每次都访问相同的一台
会话信息–》登录信息,购物车里
3.least-connected 最小连接数
http{
upstream scweb { #定义一个负载均衡器名字叫scweb
server 192.168.0.17:8080;
server 192.168.0.18:8080;
server 192.168.0.19:8080;
server 192.168.0.7:8080;
}
server {
listen 80; #监听80端口
server_name www.sc.com; #为www.sc.com 域名服务
location / {
proxy_pass http://scweb ; #调用负载均衡器
}
.....省略很多配置
}
[root@load-balancer conf]# nginx -s reload 重新加载配置文件--》相当于重启了nginx服务
[root@load-balancer conf]#
[root@load-balancer conf]# ps axu|grep nginx
root 7569 0.0 0.1 46356 2016 ? Ss 11:28 0:00 nginx: master process nginx
sanchua+ 12158 0.0 0.1 46816 2044 ? S 11:58 0:00 nginx: worker process
root 12160 0.0 0.0 112824 980 pts/2 S+ 11:59 0:00 grep --color=auto nginx
[root@load-balancer conf]#
四·项目环境
centos7/8服务器8台、nginx 1.21.1、ab、nfs4、
zabbix、keepalived 2.1.5 、ansible,bind
五· 项目描述
构建一个基于nginx的4/7层负载均衡的web集群项目
模拟企业的业务环境达到构建一个高并发,高可用的web集群。
通过压力测试来检验整个集群的性能,找出瓶颈,不断的去优化。
六· 项目步骤
1.安装
安装部署ansible服务,和其他的服务器之间建立免密通道,编写playbook去安装部署nginx和zabbix
2.配置
通过ansible上去部署nginx和zabbix,配置好nginx长连接,并发数,和worker的进程数,限制速度以及zabbix的相关配置等,上传网站内容(搭建一个WordPress的博客系统或者flask接口网站等)
3.实现负载均衡
使用2台服务器做双vip的负载均衡器,使用nginx的4/7层负载均衡功能实现,调度算法使用加权轮询
4.搭建服务器
搭建nfs服务器,保障网站的数据一致性,并且设置后端的real-server/backend server开机自动挂载
5.压力测试
在客户机上使用ab软件进行压力测试
6.监控
在zabbix/prometheus监控平台上添加相关的服务器和监控项,监控整个web集群的性能 --》zabbix
7.高可用
使用keepalived软件给负载均衡器做高可用,防止单点故障 --》keepalived
8.域名解析
搭建一个dns服务器,给整个web集群进行域名解析,通过dns域名解析负载均衡将2个vip绑定到一个域名给用户访问使用,从而将流量导入到不同的负载均衡器上
9.提升性能
尝试去优化整个web集群,提升性能:内核参数,nginx参数的优化,考虑加缓存等措施
10.使用ansible编写playbook
尝试全部使用ansible编写playbook安装所有的软件: nginx,zabbix,keepalived,ab,nfs等
七· 项目总结
1.慢慢理解了集群的概念,从1台到多台
2.对高性能和高可用有了一定的认识,对系统的性能指标参数有了一定的认识,对脑裂现象有了一定的了解和如何避免
3.对一键部署和安装有了一定的了解,非常的方便和快捷,今后尝试更加好的自动化操作 --》ansible
4.对压力测试下整个集群的瓶颈有了一个整体的概念
5.对系统的优化有了一些认识,感觉非常的有必要,在不增加成本的情况下提升性能
6.对监控也有了一点接触,监控是非常基础的运维工作,可以提前看到问题,做好预警。
7.对今后学习大规模的集群打下基础,整体规划的能力得到提升
8.troubleshooting的能力得到了提升
9.对很多基础功能的软件的配合有了一定的了解,例如:zabbix,keepalived,ansible,nginx,nfs,ab,bind等
10.对dns负载均衡,4/7层负载均衡有了一定了解
八·搭建WEB注意⚠️
1.web网站的内容,需要你确定: 博客,接口网站,测试页面等
数据的一致性问题: NFS,san,云存储,NAS等
2.内核参数的优化:
[root@docker ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
net.ipv4.conf.all.promote_secondaries = 1
net.ipv4.conf.default.promote_secondaries = 1
net.ipv6.neigh.default.gc_thresh3 = 4096
net.ipv4.neigh.default.gc_thresh3 = 4096
kernel.softlockup_panic = 1
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
kernel.shmmax = 68719476736
kernel.printk = 5
kernel.sysrq = 1
kernel.numa_balancing = 0
[root@docker ~]# ulimit
unlimited
[root@docker ~]# ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 14826
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 100001
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 14826
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@docker ~]#
ab -c 2000 -n 100000 http://192.168.0.92/