一、nginx upstream 模块介绍

1、upstream模块介绍

nginx的负载均衡功能依赖于ngx_http_upstream_module模块,所支持的代理方式包括 proxy_pass、 fastcgi_pass、 memcached_pass等,新版Nginx软件支持的方式所有增加。本文主要讲解 proxy_pass代理方式。

ngx_http_upstream_module模块允许Nginx定义一组或多组节点服务器组,使用时可以通过 proxy_pass代理方式把网站的请求发送到事先定义好的对应 Upstream组的名字上,具体写法为"proxy_pass_http:/www_server_pools",其中www_server_pools就是个Upstream节点服务器组名字。

ngx_http_upstream_module模块官方地址为:http://nginx.org/en/docs/http/ngx_http_upstream_module.html

2. upstream模块语法

upstream模块的语法相当简单,这里直接上范例给大家讲解。

范例1:基本的 upstream配置案例

	upstream www_server_pools   {
#upstream是关键字必须要有。后面的www_server_pools为一个upstream集群组的名字,可以自定义,调用时就用这个名字。
server 192.168.100.107:80 weight=5;
#server关键字是固定的,后面可以接域名(门户会用)或IP。如果不指定端口,默认是80端口,weight代表权重,数值越大被分配的请求越多,结尾有分号。
server 192.168.100.108:80 weight=10;
server 192.168.100.109:82 weight=15;
}

范例2:比较完整的upstream配置案例

	upstream web_server_pools   {
server 192.168.100.106; #这一行标签和下一行是等价的
server 192.168.100.107:80 weight=1; max_fails=1 fail_timeoyt=20s backup; #这一行标签和上一行是等价的,此行对于的部分就是默认配置,不写也可以
server 192.168.100.108:80 weight=1; max_fails=2 fail_timeoyt=20s backup;
#server最后面可以加很多参数,具体参数作用看下文表格
server 192.168.100.109:82 weight=1; max_fails=2 fail_timeoyt=20s backup;
}

范例3:使用域名及socket的upstream配置案例

	upstream backend   {
server backend1.example.com weight=5;
server backend1.example.com:8080; #域名加端口,转发到后端的指定端口上
server unix:/tmp/backend3; #指定socket文件
server 192.168.100.107
server 192.168.100.108:8080
server backup1.example.com:8080 backup;
#备份服务器,等上面指定的服务器都不可访问的时候会启用,backup的用法和haproxy中用法一样
server backup2.example.com:8080 backup;
}

如果是2台web服务器做高可用,常规方案就需要keepalived配合,那么这里使用nginx的backup参数通过负载均衡功能就可以实现web服务器集群了,对于企业应用来说,能做集群就不做高可用。

3、upstream模块相关说明

upstream模块应放于nginx.conf配置的http{}标签内。

upstream模块默认算法是wr(权重轮询 weighted round-robin)。

upstream模块内部部分参数说明

server 192.168.100.103:80    负载均衡后面的RS配置,可以是IP或域名,端口不写,默认是80端口。高并发场景IP要换成域名,通过DNS做负载均衡。

weight    是权重,默认是1.权重越大接受的请求越多。

max_falis=2    最大尝试失败的次数,默认为1,0表示禁止失败尝试。

backup    热备配置(RS节点的高可用),当前面激活的RS都失败后会自动启用热备RS。

fail timeout=20s    失败超时时间,默认是10s。

down    这标志着服务器永远不可用,这个参数一直配合 ip hash使用。

示例如下:

upstream backend {
server backend.example.com weight=5; #如果就是单个server,没必要设置权重;
server 127.0.0.1:8080 max_fails=5 fail_timeout=10s; #当检测次数等于5的时候,5次连续检测失败后,间隔10s再重新检测,这个参数和proxy/fasrcgi/memcached_next_upstream相关;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup; #热备机器设置
}

需要特别说明的是,如果nginx代理Cache服务,可能需要使用hash算法,此时若宕机,可通过设置down参数确保客户端用户按照当前的hash算法访问,这一点很重要。示例配置如下:

upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}

下面是Haproxy负载均衡器server标签的配置示例:

#开启对后端服务器的健康检查,通过GET /test/index.php来判断后端服务器的健康情况
server php_server_1 10.12.25.68:80 cookie 1 check inter 2000 rise 3 fall 3 weight 2
server php_server_2 10.12.25.72:80 cookie 2 check inter 2000 rise 3 fall 3 weight 1
server php_server_bak 10.12.25.79:80 cookie 3 check inter 1500 rise 3 fall 3 backup 上述命令的说明如下:
weight:调节服务器的请求分配权重。
check:开启对该服务器健康检查。
inter:设置连续两次的健康检查间隔时间,单位毫秒,默认值2000。
rise:指定多少次连续成功的健康检查后,即可认定该服务器处于可用状态。
fall:指定多少次不成功的健康检查后,即认为服务器为宕机状态,默认值3。
maxconn:指定可被发送到该服务器的最大并发连接数。
更多的Nginx_upstream模块参数请参考:http://nginx.org/en/docs/http/ngx_http_upstream_module.html

4、upstream模块调度算法

调度算法一般分为两类,第一类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情况,例如:rr、wrr、 ip_hash等都属于静态调度算法。

第二类为动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求,例如:连接数少的优先获得请求,响应时间短的优先获得请求。例如: least_conn、fair等都属于动态调度算法。

下面是常见的调度算法

1)、rr轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
示例:

upstream bakend {
server 192.168.100.103 weight=10;
server 192.168.100.104 weight=10;
server 192.168.100.105 down;
server 192.168.100.106 backup;
}

2)、 weight(权重)
在轮询算法的基础上加上权重(默认是rr+weight),权重轮询和访问成正比,权重越大转发的请求也越多。可以根据服务器的配置和性能指定权重值大小,可以有效的解决新旧服务器性能不均进行请求分配问题。
示例:

upstream backend {
server 192.168.100.103 weight=3;
server 192.168.100.104 weight=5;
server 192.168.100.105 weight=9;
}

3)、ip_hash
每个请求按访问IP的hash结果分配,当新的请求到达时,先将其客户端IP通过哈希算法哈希出一个值,在随后请求客户端,IP的哈希值只要相同,就会被分配至同一台服务器(LVS负载均衡的-p参数, keepalived配置里的 persistence_timeout 50),该调度算法可以解决动态网页 session共享问题,但有时会导致请求分配不均,即无法保证1:1的负载均衡。在国内所有的公司都是NAT上网,多个PC对应一个外部IP。
示例:

upstream backend {
ip_hash;
server 192.168.100.103:80;
server 192.168.100.104:80;
server 192.168.100.105:80;
}

注意:
#当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
#导致负载不均衡。

4)、 fair(第三方,NO)动态算法
按照后端服务器RS的响应时间来分配请求,响应时间短的优先分配。
这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
示例:

upstream backend {
server 192.168.100.103;
server 192.168.100.104;
server 192.168.100.105;
fair;
}

5)、 url_hash,目前用consistent_hash替代url_hash
按访问url的hash结果来分配请求,让每个url定向到同一个后端服务器,后端服务器为缓存服务器时效果显著。在 upstream中加入hash语句, server语句中不能写入 weight等其他的参数, hash_method是使用的hash算法。
url_hash。按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率命中率。 Nginx本身是不支持 url_hash的,如果需要使用这种调度算法,必须安装 nginx的hash软件包。url_hash(web缓存节点)和ip_hash(会话保持)类似。
示例:

upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

6)、least_conn
least_conn算法会根据后端节点的连接数来决定分配情况,哪个机器连接数少就分发。

7)、 一致性HASH
一致性hash算法一般用于代理后端业务为缓存服务(如 Squid、 Memcached)的场景,通过将用户请求的URI或者指定字符串进行计算,然后调度到后端的服务器上,此后任何用户查找同一个URI或者指定字符串都会被调度到这一台服务器上,因此后端的每个节点缓存的内容都是不同的,一致性hash算法可以解决后端某个或几个节点宕机后,缓存的数据动荡最小,一致性hash算法知识比较复杂,详细内容可以参考后文或相关资料,这里仅仅给出配置示例
示例:

http {
upstream test {
consistent_hash $request_uri; server 127.0.0.1:9001 id=1001 weight=3;
server 127.0.0.1:9002 id=1002 weight=10;
server 127.0.0.1:9003 id=1003 weight=20;
}
}

虽然nginx本身不支持一致性hash算法,但nginx的分支Tengine支持,详细可见下面的链接:
http://tengine.taobao.org/document_cn/http_upstream_consistent_hash_cn.html
https://blog.csdn.net/cywosp/article/details/23397179

5、upstream参数官方说明

1)、weight=number
该服务器的权重默认为1,数值越大,服务器会被转发更多的请求。
注意:当负载均衡算法为ip_hash时,后端服务器在负载均衡中的状态不能是weight和backup

2)、max_conns=number
nginx尝试连接后端主机失败的次数,这个数值是配合proxy_next_upstream,fastcgi_next_upstream, andmemcached_next_upstream这三个参数来使用的,当Nginx接收后端服务器返回这三个参数定义的状态码的时候,会将这个请求转发给正常工作的后端服务器,例如404,502,503,Max_fails默认值是1;

3)、fail_timeout=time
在max_fails定义的失败次数后,距离下次检查的间隔时间,默认是10s;
如果max_fails是5,他就检测5次,如果5次都是502,那么,它就会根据fail_timeout的值等待10s再去检查。

4)、backup
将服务器标记为备份服务器。当所有主服务器不可用时,才会向他转发请求。
注意:当负载均衡算法为ip_hash时,后端服务器在负载均衡中的状态不能是weight和backup

5)、down
这标志着服务器永远不可用,这个参数一直配合ip_hash使用。

6)、max_fails=5 fail_timeout=10s
重新加载 nginx配置,如果后端出现 proxy_next_upstream中定义的错误(502), Nginx会根据 max_fails的值去后端服务器检测,如果max_fails是5,他就检测5次,如果5次都是502。那么,他就会根据 fail_timeout的值,等待10s再去检查,过10s后检查一次,如果还是502,那么继续等待10s,再去检查,还是只检查一次,如果持续502,在不重新加载 nginx配置的情况下,每隔10s都只检测一次。

7)、max_conns=number
限制与代理服务器(1.11.5)同时激活连接的最大数量。默认值为零,意味着没有限制。如果服务器组不驻留在共享内存中,则每个工作进程的限制都有效。

8)、slow_start=time
设置服务器恢复其重量从零到标称值的时间,当不健康的服务器变得健康时,或者服务器在一段时间被认为是不可用的时候变得可用。默认值为零,即禁用慢启动。

二、http_proxy_module模块

1、proxy_pass指令介绍

proxypass指令属于ngx_http_proxy_module模块,此模块可以将请求转发到另一台服务器,在实际的反向代理工作中,会通过 location功能匹配指定的URI,然后把接收到的符合匹配URI的请求通过 proxy_pass抛给定义好的 upstream节点池。该指令官方地址http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
下面是proxy_pass的使用案例:

1)将匹配URI为name的请求抛给http://127.0.0.1/remote/

location /name/ {
proxy_pass http://127.0.0.1/remote/;
}

2)将匹配URI为some/path的请求抛给http://127.0.0.1

location /some/path/ {
proxy_pass http://127.0.0.1
}

3) 将匹配URI为name的请求应用指定的rewrite规则,然后抛给http://127.0.0.1

location /name/ {
rewrite /name/([^/]+) /users?name=$1 break;
proxy_pass http://127.0.0.1;
}

2、http proxy模块

nginx的代理功能是通过http proxy模块来实现的。默认在安装nginx时已经安装了http proxy模块,因此可以直接使用http proxy模块。

下面是每个选项代表的含义:

proxy_set _header    设置由后端的服务器获取用户的主机名或者真实P地址,以及代理者的真实|P地址。

clien_ body_ buffer-size    用于指定客户端请求主体缓冲区大小,可以理解为先保存到本地再传给用户。

proxy_ connect_ timeout    表示与后端服务器连接的超时时间,即发起握手等候响应的超时时间。

proxy_send_timeout    表示后端服务器的数据回传时间,即在规定时间之内后端服务器必须传完所有的数据,否则,Ngm将断开这个连接

proxy_read_timeout    设置Ngnx从代理的后端服务器获取信息的时间,表示连接建立成功后, Nginx    等待后端服务器的响应时间,其实是Ngnx已经进入后端的排队之中等候处理的时间。

proxy_buffer_size    设置缓冲区大小,默认,该缓冲区大小等于指令 proxy_buffers设置的大小

proxy_buffers    设置缓冲区的数量和大小。 nginx从代理的后端服务器获取的响应信息,会放置到缓冲区。

proxy_busy_buffers_size        用于设置系统很忙时可以使用的 proxy buffers大小,官方推荐的大小为proxyrbuffers'*2。

proxy_temp_file_write_size        指定poxy缓存临时文件的大小。

示例:

worker_processes  1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65; upstream web_pools { server 10.0.0.9:80 weight=5 max_fails=10 fail_timeout=10s;
server 10.0.0.10:80 weight=5;
#server 10.0.0.10:80 weight=5 backup;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
root html;
index index.html index.htm;
proxy_pass http://web_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
} }
}

proxy_pass参数说明:

proxy_pass http://blog_server_pool;    用于指定反向代理的服务器池。

proxy_set_header Host $host;    当后端Web服务器上也配置有多个虚拟主机时,需要用该 Header来区分反向代理哪个主机名。

proxy_ set_ header X-Forwarded-For $remote_addr;    如果后端Web服务器上的程序需要获取用户P,从该Heard头获取。

也可以把这些代理参数单独保存在一个文件中,通过include proxy.conf引入进来。

vim proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k;

在nginx主配置文件中引入

vim nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65; upstream web_pools { server 10.0.0.9:80 weight=5 max_fails=10 fail_timeout=10s;
server 10.0.0.10:80 weight=5;
#server 10.0.0.10:80 weight=5 backup;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
root html;
index index.html index.htm;
proxy_pass http://web_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
include proxy.conf;
}
}

nginx负载均衡核心组件介绍的更多相关文章

  1. 企业级Nginx负载均衡与keepalived高可用实战(一)Nginx篇

    1.集群简介 1.1.什么是集群 简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器. ...

  2. Nginx负载均衡介绍

    Nginx真心牛逼 nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态.静态页面的分离,可以按照轮询.ip哈希.URL哈希.权重等多种方式 ...

  3. Nginx几种负载均衡方式介绍

    Nginx几种负载均衡方式介绍 前言 负载均衡就是Nginx将请求分摊到不同的服务器中,保证服务的可用性,缓解服务压力,保证服务的响应速度,即使某一个应用服务不可用,也可以保证业务的正常进行,并且方便 ...

  4. Nginx作为负载均衡服务介绍

    ​ GSLB ​ SLB ​ 四层负载均衡 ​ 七层负载均衡 ​ 四层负载均衡 四层负载均衡工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP.目标IP以外,还 ...

  5. Nginx负载均衡策略的介绍与调优

    工作中经常会用到nginx负载均衡这一块,下面对nginx负载均衡策略做个总结.本人在工作中最常用到的负载均衡策略是轮询策略. 在一般情况下,Web中间件最大的作用就是负责对请求进行分发,也就是我们常 ...

  6. Net分布式系统之二:CentOS系统搭建Nginx负载均衡

    一.关于CentOS系统介绍 CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat ...

  7. Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用

    上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常运行.针对系统架构设计的高可用要求,我们需要解决Nginx ...

  8. 烂泥:nginx负载均衡

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 今天我们来学习下有关nginx的负载均衡配置.nginx的负载均衡是通过nginx的upstream模块和proxy_pass反向代理来实现的. 说明: ...

  9. Nginx负载均衡深入浅出

    nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态.静态页面的分离,可以按照轮询.ip哈希.URL哈希.权重等多种方式对后端服务器做负载均 ...

随机推荐

  1. 022 Generate Parentheses 生成括号

    给 n 对括号,写一个函数生成所有合适的括号组合.比如,给定 n = 3,一个结果为:[  "((()))",  "(()())",  "(())() ...

  2. Java多线程与并发——线程生命周期和线程池

    线程生命周期:  线程池:是预先创建线程的一种技术.线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中,然后对这些资源进行复用.减少频繁的创建和销毁对象. java里面线程池的顶级接口是E ...

  3. datagrid 里面的formatter方法

    A.{field:'station_staus',title:'工位状态',width:250,align:'center',formatter: function(value,row,index){ ...

  4. 机器学习框架ML.NET学习笔记【1】基本概念与系列文章目录

    一.序言 微软的机器学习框架于2018年5月出了0.1版本,2019年5月发布1.0版本.期间各版本之间差异(包括命名空间.方法等)还是比较大的,随着1.0版发布,应该是趋于稳定了.之前在园子里也看到 ...

  5. MySQL分库分表的技巧

    分表是分散数据库压力的好方法. 分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库. 当然,首先要知道什么情况下,才需要分表.个人觉得单表记录条数达到百万到千万 ...

  6. php允许被跨域ajax请求

    只要在被请求端,加一句: header('Access-Control-Allow-Origin: *');

  7. jstack的使用方法

    背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高 ...

  8. weexpack 创建项目, 打包Android 和 ios

    1: 首先确保 node.js版本大于6.0, 不然使用 weexpack 时会报错(部分使用es6语言,node版本太低不支持es6) 下面所有都是命令行执行的命令 2: 全局安装 weexpack ...

  9. 在MVC中使用NHibernate学习记录

    NHibernate简介: NHibernate是一个面向.net环境的对象/关系数据库映射工具,对象/关系数据库映射(object/relational mapping,ORM)是一种技术,可以将对 ...

  10. matplotlib学习之(四)设置线条颜色、形状

    本文是学习<matplotlib for python developers>的一点笔记plot画图时可以设定线条参数.包括:颜色.线型.标记风格.1)控制颜色颜色之间的对应关系为b--- ...