负载均衡 - nginx基本配置与分发策略

[TOC]

1 为什么叫反向代理?

关于反向代理和正向代理的概念,贴出知乎上面的一个回答,个人觉得还是很形象的。
https://www.zhihu.com/question/24723688

正向代理,被代理对象是客户端,服务端不知道客户端是谁,只知道代理对象.

反向代理,被代理对象是服务端,客户端不知道服务端是谁,只知道代理对象

2 Nginx如何处理请求

2.1 基于域名的虚拟主机

server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}

如上面的配置,就是使用基于域名的配置,请求会对应到对应server_name的主机上面,如果没有匹配的主机,这个时候nginx会默认把第一当做默认处理主机,当然也可以使用如下配置(default_server)指定默认处理主机:

server {
    listen      80 default_server;
    server_name example.net www.example.net;
    ...
}

2.2 基于域名和IP的虚拟主机

接下来看看不同主机listen on 不同的IP地址

server {
    listen      192.168.1.1:80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      192.168.1.1:80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      192.168.1.2:80;
    server_name example.com www.example.com;
    ...
}

对于这种情况,Nginx会先检测IP和端口,再去检测server_name是否匹配,如果IP匹配了,但是server_name 没有匹配,就是使用当前匹配的ip+port的default_server ,如果没有配置default_server就是默认使用第一个作为default_server.

关于server_name的几种形式

  1. 字符串或者IP地址
  2. 通配符,*
  3. 正则表达式
  4. 多个一起组合而成(上例中server_name每个配置了多个name)
  5. 一些特殊字符,例如: "","-","--"等

3 负载均衡(load balance)

3.1 负载均衡算法(Load balancing methods)

使用Nginx作为http负载均衡实现。Nginx负载均衡算法有如下几种:

  1. Round-Robin,轮询调度算法,当配置未指明的时候,默认就是轮询算法
  2. least-connected,下一次链接将被链接到活跃链接最少的机器上
  3. ip-hash,利用IP地址哈希进行分配
  4. weight-balancing,按照权重分配

需要说明的是,很多时候,weight-balancing都是和least-connected或者ip-hash算法一起使用,在官方文档中,都没有把他算做load balancing methods中的一种。

3.2 常见配置示例

  1. 最常见的配置,默认轮询算法
http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}
  1. 使用least-connected
upstream myapp1 {
    least_conn;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}
  1. 使用ip-hash算法
upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}
  1. 权重分配
upstream myapp1 {
        server srv1.example.com weight=3;
        server srv2.example.com;
        server srv3.example.com;
    }

此种配置,srv1占比3/5,srv2,srv3分别占比 1/5

4 关于健康检查

简单的服务端示例健康检查,使用server配置上面的fail_timeout配置,设置失败时间,在设置时间内没回应,Nginx就会用不断的起尝试,如果可行就标记服务为live。如果客户端返回错误,Nginx就会标记这个节点为failed,然后避免转发请求到这个节点。

关于健康监测,在后续总结中会有专门的分析使用。

5 ngx_http_upstream_module

更多时候我们配置都是这个模块的一些配置,下面简单总结下此模块的配置说明

先提供一个示例:

upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

http模块中比较重要的几个节点

upstream name {....}

在upstream中常见的节点有 server,ip_hash,keepalive,least_conn,least_time

分别介绍下这几个节点

5.1 upstream-->server

Syntax: server address [parameters];
Default:    —
Context:    upstream

server的上下文为upstream,后面server地址和配置参数,如:server 192.168.0.100 weight=10 max_fails=3 fail_timeout=5

分别介绍下可选的几个参数的含义:

  1. weight=number: 之前说过的,配置主机的权重,配合负载均衡算法
  2. max_conns=number: 同时生效的链接数上线,默认为0,表示不限制。如果server group不在共享内存中,则次值按每个 worker process 来工作
  3. fail_timeout=number: 1.在指定时间内超时,任务服务不可达时候尝试超时时间。2.判断服务不可用时间。默认时间为10s.
  4. max_fails=number:配合fail_timeout,做大的尝试次数,默认值为1,设置为0表示不统计尝试次数。
  5. backup:设置当前server 为备份机器,放主机器不可达的时候,请求会传递过来
  6. down:标记当前节点宕机
  7. resolve:指明解析的IP,要使用resolve ,需要先在http几点下面配置resolver,例如:
http {
    resolver 10.0.0.1;

    upstream u {
        zone ...;
        ...
        server example.com resolve;
    }
}
  1. route:设置服务路由名称
  2. service:启用DNS解析SRV,并设置service名称
  3. slow_start:设置多久之后,server回复自己的权重值,设置server从不可达到健康之后多久认为是可用。次配置不能用在upstream 为 hash 或者ip_hash的算法中。当server Group 中只有一个server的时候,max_fails、 fail_timeout 、slow_start都会被忽略。

5.2 upstream-->hash/ip_hash

hash key [consistent]; 使用key值来做hash负载均衡,一旦添加个删除机器,需要重新做hash,负载后的路径可坑改变

ip_hash; 在upstream 中启用按照IP进行hash的分配策略

5.3 upstream-->keepalive

keepalive 激活服务器到upstream的缓存,设置上限的话,设置链接缓存的最大数量,如果超出数量,最少使用的链接就会被关闭。

例如:

upstream memcached_backend {
    server 127.0.0.1:11211;
    server 10.0.0.2:11211;

    keepalive 32;
}

5.4 upstream-->least_conn/least_time

least_conn: 使用least_conn 的负载均衡方式,找到链接最少的机器处理,并且结合权重来处理,如果有多台候选机器的话,会接着使用轮询的方式。

least_time: 找到平均响应时间最少并且连接数最少的机器,并结合权重,如何有多台候选机器的话,会接着使用轮询的方式。

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

推荐阅读更多精彩内容

  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,636评论 24 1,002
  • 《老男孩Linux运维》Nginx Documentation 集群简介 集群就是指一组(若干)相互独立的计算机,...
    Zhang21阅读 3,373评论 0 51
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 以下内容来自官方文档 http://nginx.org/en/docs/http/ngx_http_upstrea...
    再回到从前阅读 2,664评论 0 1
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,988评论 0 9