nginx负载均衡优化和高可用

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 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;
        #超大的响应头存储成文件。
    }
AI 代码解读

}

保存退出
systemctl restart nginx

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

(4)扩展:创建优化项文件,网站配置文件直接调用(选做,但推荐)
vim /etc/nginx/nginx_params
添加:
proxy_set_header Host httphost;proxysetheaderXRealIPremote_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;
    }
AI 代码解读

}
}
保存退出
重启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  
AI 代码解读

(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;
    }
AI 代码解读

}
}
保存退出
重启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;
    }
AI 代码解读

}
保存退出
重启服务: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地址漂移

相关实践学习
小试牛刀,一键部署电商商城
SAE 仅需一键,极速部署一个微服务电商商城,体验 Serverless 带给您的全托管体验,一起来部署吧!
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
打赏
0
1
1
1
45
分享
相关文章
一文读懂什么是Nginx?它能否实现IM的负载均衡?
Nginx(及其衍生产品)是目前被大量使用的服务端反向代理和负载均衡方案,从某种意义上来讲,Nginx几乎是低成本、高负载Web服务端代名词。 如此深入人心的Nginx,很多人也想当然的认为,在IM或消息推送等场景下是否也能使用Nginx来解决负载均衡问题? 另外,即时通讯网的论坛和QQ群里也经常有人问起,Nginx是否能支持TCP、UDP、WebSocket的负载
90 4
Nginx 常用的负载均衡算法
【10月更文挑战第17天】在实际应用中,我们需要根据具体的情况来选择合适的负载均衡算法。同时,还可以结合其他的优化措施,如服务器健康检查、动态调整权重等,来进一步提高负载均衡的效果和系统的稳定性。
223 59
Nginx长连接负载均衡详细说明以及案例
本文详细介绍了Nginx长连接负载均衡的配置与原理。长连接(Keepalive)允许客户端和服务器保持连接,减少建立和关闭连接的开销。Nginx支持多种负载均衡算法,如轮询、IP哈希等。通过在Nginx配置文件中使用`upstream`模块和`keepalive`指令,可以实现长连接负载均衡,从而提高系统的性能和响应速度。示例配置展示了如何设置后端服务器组、长连接数及HTTP/1.1协议,确保连接复用,降低延迟。
109 5
搭建高可用及负载均衡的Redis
通过本文介绍的高可用及负载均衡Redis架构,可以有效提升Redis服务的可靠性和性能。主从复制、哨兵模式、Redis集群以及负载均衡技术的结合,使得Redis系统在应对高并发和数据一致性方面表现出色。这些配置和技术不仅适用于小型应用,也能够支持大规模企业级应用的需求。希望本文能够为您的Redis部署提供实用指导和参考。
288 9
ECS中实现nginx4层7层负载均衡和ALB/NLB原SLB负载均衡
通过本文的介绍,希望您能深入理解并掌握如何在ECS中实现Nginx四层和七层负载均衡,以及如何使用ALB和NLB进行高效的负载均衡配置,以提高系统的性能和可靠性。
353 9
如何配置Nginx反向代理以实现负载均衡?
如何配置Nginx反向代理以实现负载均衡?
Nginx的负载均衡
Nginx 是一款高性能的Web服务器与反向代理服务器,支持负载均衡功能,能有效提升系统性能与可靠性。其负载均衡策略包括基于轮询和权重的分配方法,以及IP哈希、最小连接数等算法,可根据实际需求灵活选择。
249 5
负载均衡指南:Nginx与HAProxy的配置与优化
负载均衡指南:Nginx与HAProxy的配置与优化
296 3
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
这篇博客文章详细介绍了Nginx的下载、安装、配置以及使用,包括正向代理、反向代理、负载均衡、动静分离等高级功能,并通过具体实例讲解了如何进行配置。
272 4
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等