nginx负载均衡优化和高可用

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
简介: nginx负载均衡优化和高可用

代理和负载均衡的区别

   代理负责把连接请求直接转发到后台某个web节点

   负载均衡负责把请求使用某种调度算法分散发布给后台所有web节点

 

1.配置nginx代理服务器lb1

lb1: 192.168.8.10
web1:192.168.8.20
web2:192.168.8.30


(1)启动lb1,安装nginx

yum -y install epel-release
yum -y install nginx 
systemctl start nginx
systemctl enable nginx


(2)创建代理配置文件,添加优化项(或直接使用第(4)步的配置)

vim /etc/nginx/conf.d/lb1.conf

添加:

server {
        listen 80;
        server_name blog.benet.com;
        location / {
                proxy_pass http://192.168.8.20;                                
                proxy_set_header Host $http_host;                                    #重新定义或者添加发往后端服务器的请求头,添加域名
                proxy_set_header X-Real-IP $remote_addr;                            #启用客户端真实地址(否则日志中显示的是代理在访问网站)
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #记录代理地址
        proxy_connect_timeout 30;                                        #代理和后端服务器连接超时时间
        proxy_send_timeout 60;                                            #后端服务器传回代理的超时时间
        proxy_read_timeout 60;                                            #代理等待后端服务器的响应时间
        proxy_buffering on;                                                #启用缓存,后端返回内容先缓存,再给客户端,收到多少转多少
        proxy_buffer_size 32k;                                            #代理缓存用户头信息的缓存区大小
        proxy_buffers 4 128k;                                            #缓存区的设置
        proxy_busy_buffers_size 256k; 
            #从proxy_buffers划出一部分缓冲区来专门向客户端传送数据的地方
        proxy_max_temp_file_size 256k;
            #超大的响应头存储成文件。
        }
}

保存退出

systemctl restart nginx


(3)客户端修改hosts文件指向lb1,测试访问


(4)扩展:创建优化项文件,网站配置文件直接调用(选做,但推荐)

vim /etc/nginx/nginx_params

添加:

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

保存退出


网站配置调用

vim /etc/nginx/conf.d/lb1.conf

修改为:

server {
        listen 80;
        server_name blog.benet.com;
        location / {
                proxy_pass http://192.168.8.20;
                include nginx_params;
        }
}
}

保存退出

重启nginx:systemctl restart nginx



2.负载均衡(Load Balance),简写LB

   面对高并发web请求,使用各种调度算法(rr,wrr,lc,wlc,ip_hash),分散转发到后台web群集节点,提高数据吞吐量,高容灾

   常见的LB:

           软件:lvs  nginx   haproxy  

           硬件:F5

           云LB:阿里云SLB    腾讯云CLB   青云QLB   ucloud ULB

         

   四层负载:ip地址    tcp/udp  端口号

   七层负载:HTTP  https  ftp   SMTP  

 

(1)修改lb1的配置文件,添加负载均衡功能

vim /etc/nginx/conf.d/lb1.conf

修改为:

upstream web_cluster {
        server 192.168.8.20:80;
        server 192.168.8.30:80;
}
server {
        listen 80;
        server_name blog.benet.com;
        location / {
                proxy_pass http://web_cluster;
                include nginx_params;
        }
}
}

保存退出

重启nginx:systemctl restart nginx


(2)客户端访问验证,浏览器如果判断不出来,就看web节点上的日志。


(3)nginx负载均衡后端状态

   weight            权重,默认为1

   down             当前节点服务器不参与负载均衡

   backup          备份服务器

   max_fails        允许请求失败的次数

   fail_timeout    经过max_fails失败后,服务的暂停时间

   max_conns       同一ip最大连接数

 

例子:

vim /etc/nginx/conf.d/lb1.conf

修改为:

upstream web_cluster {
        server 192.168.8.20:80 max_fails=2 fail_timeout=10s max_conns=1;  
        server 192.168.8.30:80 down;            #一般用于停机维护
}

#################################################################################

1.配置4层负载均衡,发布内部服务器的ssh和mysql

lb:192.168.8.10

web1: 192.168.8.20

mysql: 192.168.8.30


vim /etc/nginx/nginx.conf

插入数据到http字段上方:

stream {
        upstream sshweb1 {
                server 192.168.8.20:22;
        }
        upstream mysql {
                server 192.168.8.30:3306;
        }
        server {
                listen 5555;
                proxy_pass sshweb1;
                proxy_connect_timeout 30;
                proxy_timeout 60;
        }
        server {
                listen 7777;
                proxy_pass mysql;
                proxy_connect_timeout 30;
                proxy_timeout 60;
        }
}

保存退出

重启服务:systemctl restart nginx


客户端访问验证ssh:

   xshell: ssh root@192.168.8.10  5555

    linux: ssh root@192.168.8.10 -p 5555


客户端访问验证mysql:

   安装navicat,建立连接192.168.8.10,端口7777


#############################################################################

高可用-增加容错性(HA:High availability)

 

协议:VRRP(虚拟路由冗余协议) 公有协议  224.0.0.18

     HSRP(热备份路由协议)   私有协议,Cisco公司 224.0.0.5 224.0.0.6


高可用软件:

   keepalived:使用vrrp实现多台主机高可用群集

   高可用角色:master 主服务器

               backup 备服务器

             

实施步骤:

目的:实现两台负载均衡器的高可用

环境:两台负载均衡器

       lb1:192.168.8.10  

       lb2:192.168.8.40


(1)安装keepalived(两台都装)

yum -y install keepalived


(2)配置keepalived

主服务器:lb1

vim /etc/keepalived/keepalived.conf

修改为:

global_defs {
   router_id lb1            #删除vrrp_strict行
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.8.254
    }
}

保存退出

启动服务:

   systemctl restart keepalived

   systemctl enable keepalived


备服务器:lb2

vim /etc/keepalived/keepalived.conf

修改为:

global_defs {
   router_id lb2            #路由id号,和主服务器必须不同(删除vrrp_strict行)
}
vrrp_instance VI_1 {
    state BACKUP            #状态:BACKUP备   MASTER主
    interface ens33
    virtual_router_id 51
    priority 99                #优先级:备比主要小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.8.254        #虚拟路由ip,公共ip
    }
}

保存退出

启动服务:

   systemctl restart keepalived

   systemctl enable keepalived


(3)查看虚拟ip(漂移ip地址)

ip a show dev ens33


(4)复制lb1(192.168.8.10)关于nginx的配置到lb2(192.168.8.40)

现在lb2安装nginx:yum -y install nginx

在lb1上scp复制nginx的所有配置:

   scp -rp /etc/nginx/*  root@192.168.8.40:/etc/nginx

然后,在lb2上启动nginx服务:

   systemctl restart nginx

 

(5)客户端修改hosts文件,访问验证(访问成功,关闭主服务器,再访问)

vim /etc/hosts

修改为:

192.168.8.254  blog.benet.com

保存退出


3.高可用裂脑

   高可用节点之间互相失去联系,自认为自己是主服务器,就会出现多主现象,即裂脑现象

 裂脑出现的原因:

   心跳线松动或网卡故障

   服务器硬件故障,崩溃

   节点服务器开启防火墙,却没有做vrrp例外

   nginx服务死掉,不会出现裂脑现象,但整个集群都无法正常运作


(1)检测裂脑脚本(在备用服务器:192.168.8.132运行)

vim split_brain.sh
#!/bin/sh
while true
do
ping -c 2 -W 3 192.168.8.10 &> /dev/null
if [ $? -eq 0 -a `ip add|grep 192.168.8.254|wc -l` -eq 1 ]
  then
    echo "split brain....."
else
    echo "HA is ok"
fi
sleep 5
done
保存退出
chmod +x split_brain.sh
source split_brain.sh

开启防火墙验证:systemctl start firewalld

解决因为防火墙出现的裂脑现象:

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0  --destination 224.0.0.18 --protocol vrrp -j ACCEPT

firewall-cmd --reload


(2)解决nginx故障造成群集无法工作

编辑nginx监控脚本

vim /sh/check_nginx_proxy.sh
#!/bin/bash
killall  -0  nginx
if  [ $? -ne 0 ];then
  systemctl stop keepalived
fi
chmod  +x  /sh/check_nginx_proxy.sh

添加脚本追踪模块到keepalived配置文件

vim /etc/keepalived/keepalived.conf
global_defs {
   router_id lb1
}
vrrp_script check_nginx_proxy {
        script “/sh/check_nginx_proxy.sh”
        interval 2
        weight 5
        }
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.254
    }
    track_script {
        check_nginx_proxy
    }
}

保存退出

重启服务:systemctl restart keepalived


(3)主服务器添加计划任务

crontab -e
* * * * * /bin/bash /sh/check_nginx_proxy.sh


(4)主服务器关闭nginx,测试keepalived地址漂移

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
1天前
|
负载均衡 应用服务中间件 nginx
Nginx怎么去做负载均衡?
Nginx的负载均衡器配置就完成了,而且由于Nginx的配置文件结构清晰而且简洁,调整和维护也相对方便。通过上述步骤,你可以将Nginx设置为一款强大的负载均衡器,提升服务器集群的处理能力及高可用性。
10 4
|
10天前
|
域名解析 负载均衡 网络协议
双重神器合璧,流量洪流中的稳如磐石:揭秘Bind+Nginx负载均衡的超级力量!
【8月更文挑战第9天】在现代网站架构中,负载均衡至关重要,它通过分散客户端请求至多台服务器,确保了系统的高可用性和稳定性。本文介绍如何结合Bind与Nginx实现高效负载均衡。Bind作为DNS服务器,可为单一域名解析出多个IP地址;Nginx作为高性能HTTP服务器,则在这些IP对应的服务器间智能分配流量。通过配置Bind的A记录与Nginx的`upstream`和`proxy_pass`指令,我们能够构建一个既稳定又易扩展的负载均衡系统,显著提升用户体验与系统可靠性。
34 11
|
7天前
|
负载均衡 监控 算法
Nginx:负载均衡小专题(二)
Nginx:负载均衡小专题(二)
23 2
|
7天前
|
负载均衡 监控 网络协议
Nginx:负载均衡小专题(三)
Nginx:负载均衡小专题(三)
29 1
|
7天前
|
负载均衡 监控 算法
Nginx:负载均衡小专题(一)
Nginx:负载均衡小专题(一)
33 1
|
8天前
|
缓存 前端开发 Java
"揭秘!SpringBoot携手Nginx,性能飙升秘籍大公开:轻松掌握配置优化,让你的应用快如闪电!"
【8月更文挑战第11天】随着微服务架构的发展,SpringBoot成为构建RESTful API的首选,Nginx则作为高性能的反向代理服务器提升应用性能。本文将探讨两者如何协同工作,包括Nginx的负载均衡策略、静态资源缓存及数据压缩配置;同时讨论SpringBoot的线程池优化、缓存策略及性能监控。通过这些方法,帮助开发者显著提高系统的整体性能和可用性。
18 1
|
18天前
|
缓存 负载均衡 Java
SpringBoot 与 Nginx 配置优化:性能拉满的关键学习方法
【8月更文挑战第1天】在现代Web开发领域,SpringBoot以其快速启动、简化配置的特性成为众多开发者的首选框架,而Nginx则以其高性能的HTTP和反向代理服务器功能著称。将两者结合,并通过精细的配置优化,可以显著提升Web应用的性能与稳定性。以下是为您学生定制的SpringBoot与Nginx配置优化的学习方法与研究路径。
36 1
|
19天前
|
存储 缓存 前端开发
(三)Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...想要的这都有!
早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业务增长,就会造成线上频繁宕机的现象发生,最终导致系统瘫痪无法继续处理用户的请求。
|
21天前
|
负载均衡 算法 应用服务中间件
nginx自定义负载均衡及根据cpu运行自定义负载均衡
nginx自定义负载均衡及根据cpu运行自定义负载均衡
22 1
|
26天前
|
运维 负载均衡 算法
SLB与NGINX的异同是什么
SLB与NGINX的异同是什么
53 2