nginx入门详解(九)- 负载均衡

负载均衡目的:

将前端超高并发访问转发至后端多台服务器进行处理,解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供服务的问题。

工作原理:

负载均衡分为四层负载均衡和七层负载均衡。

四层负载均衡是工作在七层协议的第四层-传输层,主要工作是转发。

它在接收到客户端的流量以后通过修改数据包的地址信息(目标地址和端口)将流量转发到应用服务器。

七层负载均衡是工作在七层协议的第七层-应用层,主要工作是代理。

它首先会与客户端建立一条完整的连接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器建立另外一条连接将请求发送过去。

实例:

前端服务器:192.168.1.6
后端服务器1:192.168.1.5
后端服务器2:192.168.1.7

这里后端服务器也可以通过配置虚拟主机实现。
配置:

前端服务器主要配置upstream和proxy_pass:

upstream 主要是配置均衡池和调度方法。

proxy_pass 主要是配置代理服务器ip或服务器组的名字

proxy_set_header 主要是配置转发给后端服务器的Host和前端客户端真实ip。

#在http指令块下配置upstream指令块

    upstream web {
        server 192.168.1.5;
        server 192.168.1.7;
    }
 
 #在location指令块配置proxy_pass 
    server {
        listen       80;
        server_name  localhost;
        location /  {
            proxy_pass http://web;
            proxy_next_upstream  error http_404 http_502;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

# proxy_next_upstream  error http_404 http_502;
通过这个指令,可以处理当后端服务返回404等报错时,
直接将请求转发给其他服务器,而不是把报错信息返回客户端。
# proxy_set_header Host $host; 
通过这个指令,把客户端请求的host,转发给后端,
否则,后端接收到的请求头Host会是web,可能会导致报错误的请求头。
# proxy_set_header X-Real-IP $remote_addr
通过这个指令,把客户端的IP转发给后端服务器,在后端服务器的日志格式中,
添加$http_x_real_ip即可获取原始客户端的IP了。

均衡方式:

1. 轮询
upstream web {
    server 192.168.1.5;
    server 192.168.1.7;
    }

访问前端IP:

[root@192 ~]# while true;do curl 192.168.1.6;sleep 2;done
this is 1.5  page
                       this is 1.7  page
this is 1.5  page
                       this is 1.7  page
                       
#可以看到后端服务器,非常平均的处理请求。
2. 轮询加权重
upstream web {
        server 192.168.1.5 weight=3;
        server 192.168.1.7 weight=1;
        }

访问前端IP:

[root@192 ~]# while true;do curl 192.168.1.6;sleep 1;done
this is 1.5  page
this is 1.5  page
this is 1.5  page
                       this is 1.7  page
this is 1.5  page
this is 1.5  page
this is 1.5  page
                       this is 1.7  page

#后端服务,根据权重比例处理请求,适用于服务器性能不均的环境。
3. 轮询+权重+最大连接错误次数

错误的连接由proxy_next_upstream, fastcgi_next_upstream等指令决定,且默认情况下,后端某台服务器出现故障了,nginx会自动将请求再次转发给其他正常的服务器(因为默认 proxy_next_upstream=error timeout)。

所以即使我们没有配这个参数,nginx也可以帮我们处理error和timeout的相应,但是没法处理404等报错。

为了看清楚本质,我们先将proxy_next_upstream设置为off,也就是不将失败的请求转发给其他正常服务器,这样我们可以看到请求失败的结果。

upstream web {
        server 192.168.1.5 weight=1  max_fails=3 fail_timeout=9s;
        #先将1.5这台nginx关了。
        server 192.168.1.7 weight=1;
        }

       
server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://web;
            #proxy_next_upstream  error http_404 http_502;
            proxy_next_upstream off; 
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
}
# 在这里,我们将超时时间设置为9s,最多尝试3次,
这里要注意,尝试3次,依然遵循轮询的规则,并不是一个请求,连接3次,
而是轮询三次,有3次处理请求的机会。

访问前端IP:

[root@192 ~]# while true;do curl -I 192.168.1.6 2>/dev/null|grep HTTP/1.1 ;sleep 3;done
HTTP/1.1 502 Bad Gateway
HTTP/1.1 200 OK
HTTP/1.1 502 Bad Gateway
HTTP/1.1 200 OK
HTTP/1.1 502 Bad Gateway
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 502 Bad Gateway

# 我们设置的超时时间为9s,我们是每3s请求一次。
我们可以看到后端一台服务器挂了后,请求没有直接转发给正常的服务器,
而是直接返回了502。尝试三次后,等待9s,才开始再次尝试(最后一个502)。

#要注意,第二行的200响应,并不是客户端第一次的请求的响应码,而是客户端第二次新的请求。

把proxy_next_upstream开启,再来访问看结果:

upstream web {
        server 192.168.1.5 weight=1  max_fails=3 fail_timeout=9s;
        #先将1.5这台nginx关了。
        server 192.168.1.7 weight=1;
        }
        
server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://web;
            proxy_next_upstream  error http_404 http_502;
            #proxy_next_upstream off; 
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
}

访问前端IP:

[root@192 ~]# while true;do curl -I 192.168.1.6 2>/dev/null|grep HTTP/1.1 ;sleep 3;done
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK

#可以看到现在没有502报错,请求都处理了。因为错误的响应码被proxy_next_upstream 获取,这次请求被转发给下一个正常的服务器了。
所以看到都是200,但是你应该清楚,哪个200是响应的上个服务器没有处理请求,哪个200是正常的响应。
4. ip_hash
upstream web {
        ip_hash;
        server 192.168.1.5 weight=1  max_fails=3 fail_timeout=9s;
        server 192.168.1.7 weight=1;
        }
        
server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://web;
            proxy_next_upstream  error http_404 http_502;
            #proxy_next_upstream off; 
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
}

访问前端IP:

[root@192 ~]# while true;do curl 192.168.1.6;sleep 2;done
this is 1.5  page
this is 1.5  page
this is 1.5  page
^C
[root@192 ~]# curl 192.168.1.7
                       this is 1.7  page
                       
#可以看到1.7的服务是正常的,但是却不转发给1.7了,请求固定在了1.5的服务器上。                      

在使用负载均衡的时候会遇到会话保持的问题,常用的方法有:

a、ip hash,根据客户端的IP,将请求分配到不同的服务器上;

b、cookie,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发布者。

注意:cookie需要浏览器支持,且有时候会泄露数据。

先说到这,后面在结合业务细聊。
这将是nginx系列文章,可关注同名微信公众号:笨办法学linux
获取最近文章更新及精品软件,软件持续更新中。

image.png

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • 《老男孩Linux运维》Nginx Documentation 集群简介 集群就是指一组(若干)相互独立的计算机,...
    Zhang21阅读 3,381评论 0 51
  • 四层负载均衡:仅仅建立一次 TCP 连接 七层负载均衡:负载均衡器与客户端及后端的服务器会分别建立一个 TCP 连...
    养码哥阅读 1,612评论 0 6
  • linux负载均衡总结性说明(四层负载/七层负载) 一,什么是负载均衡1)负载均衡(Load Balance)建立...
    phpdi阅读 396评论 0 0
  • 个人专题目录 nginx安装手册 LVS,Nginx和HAProxy负载均衡对比 Nginx支持TCP代理和负载均...
    Java及SpringBoot阅读 18,248评论 3 5
  • 一 方法:方法一的执行过程就是把数字转换成字符串后,打散为数组,再从末尾开始,逐个把数组中的元素插入到新数组(re...
    a不知所谓阅读 446评论 0 0