• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Nginx upstream模块相关指令

Nginx 彭东稳 8年前 (2016-07-23) 23521次浏览 已收录 0个评论

负载均衡模块(ngx_http_upstream_module)

ngx_http_upstream_module模块允许定义一组服务器,做后端服务器负载均衡。它们可以在指令proxy_pass、 fastcgi_pass和 memcached_pass中被引用到。下面就介绍相关参数的使用。

1)upstream

upstream就是用来定义一组服务器做负载均衡,然后给定一个名称,这些服务器可以监听不同的端口。 而且,监听在TCP和UNIX域套接字的服务器可以混用。注意upstream参数只能定义在http配置段中,只有被proxy_pass、fastcgi_pass和memcached_pass引用时才能生效。

例子:

引用:

默认情况下,nginx按加权轮转的方式将请求分发到各服务器。在上面的例子中,每7个请求会通过以下方式分发: 5个请求分到backend1.example.com, 一个请求分到第二个服务器,一个请求分到第三个服务器。 与服务器通信的时候,如果出现错误,请求会被传给下一个服务器,直到所有可用的服务器都被尝试过。 如果所有服务器都返回失败,客户端将会得到最后通信的那个服务器的(失败)响应结果。这种机制也就是重试机制,如果想关闭重试机制,那么在你使用proxy_pass或fastcgi_pass或memcached_pass时都有相应的参数可以选择关闭后端upstream重试,默认都是开启的。如关闭proxy_pass模块的重试机制。其他模块可以看对应模块的关闭参数。

我个人对重试机制并没有什么好感,建议关闭。在生产环境中大部分业务都是关闭重试功能的,开启会出现很多问题。比如支付类不允许有重试,另外当应用程序服务器出现压力过大时,如果开启重试会出现连锁反应,给服务器造成更大的压力。

2)server

server参数就是用来定义一组服务器,并可以定义访问后端主机的参数,只能定义在upstream中。地址可以是域名或者IP地址,端口是可选的,或者是指定“unix:”前缀的UNIX域套接字的路径。如果没有指定端口,就使用80端口。 如果一个域名解析到多个IP,本质上是定义了多个server。

参数可以有如下这些:

weight=number

设定服务器的权重,默认是1,可以理解为这个主机轮询一次接收一个请求。

max_fails=number

设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。在下一个fail_timeout时间段,服务器不会再被尝试。 失败的尝试次数默认是1。设为0就会停止统计尝试次数,认为服务器是一直可用的。 你可以通过指令proxy_next_upstream、 fastcgi_next_upstream和memcached_next_upstream来配置什么是失败的尝试。 默认配置时,http_404状态不被认为是失败的尝试。

fail_timeout=time

设定统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。服务器被认为不可用的时间段。默认情况下,该超时时间是10秒。

backup

标记为备用服务器,当主服务器不可用以后,请求会被传给这些服务器。

down

标记服务器永久不可用,可以跟ip_hash指令一起使用。

max_conns

限制到代理服务器的最大连接数,默认值为零,这意味着没有限制。当keepalive和multiple worker被启用时,对代理服务器的连接的总数可能超过max_conns的值。

示例:

3)ip_hash

指定服务器组的负载均衡方法,请求基于客户端的IP地址在服务器间进行分发。 IPv4地址的前三个字节或者IPv6的整个地址,会被用来作为一个散列key。这种方法可以确保从同一个客户端过来的请求,会被传给同一台服务器,可以解决session的问题。除了当服务器被认为不可用的时候,这些客户端的请求会被传给其他服务器,而且很有可能也是同一台服务器。

如果其中一个服务器想暂时移除,应该加上down参数。这样可以保留当前客户端IP地址散列分布。

示例:

4)keepalive

开启对上游服务器的连接进行缓存。connections参数设置每个worker进程与后端服务器保持连接的最大数量。这些保持的连接会被放入缓存。 如果连接数大于这个值时,最久未使用的连接会被关闭。

需要注意的是,keepalive指令不会限制Nginx进程与上游服务器的连接总数。新的连接总会按需被创建,connections参数应该稍微设低一点,以便上游服务器也能处理额外新进来的连接。

对于HTTP代理,proxy_http_version指令应该设置为“1.1”,同时“Connection”头的值也应被清空。

对于FastCGI的服务器,需要设置 fastcgi_keep_conn 指令来让连接keepalive工作:

配置memcached上游服务器连接keepalive的例子:

当使用的负载均衡方法不是默认的轮转法时,必须在keepalive 指令之前配置。针对SCGI和uwsgi协议,还没有实现其keepalive连接的打算。

5)least_conn 

指定服务器组的负载均衡方法,根据其权重值,将请求发送到活跃连接数最少的那台服务器。如果这样的服务器有多台,那就采取有权重的轮转法进行尝试。

嵌入的变量

ngx_http_upstream_module模块支持以下嵌入变量:

$upstream_addr

保存服务器的IP地址和端口或者是UNIX域套接字的路径。 在请求处理过程中,如果有多台服务器被尝试了,它们的地址会被拼接起来,以逗号隔开,比如: “192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”。 如果在服务器之间通过“X-Accel-Redirect”头或者error_page有内部跳转,那么这些服务器组之间会以冒号隔开,比如:“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”。

$upstream_response_time

以毫秒的精度保留服务器的响应时间,(输出)单位是秒。 出现多个响应时,也是以逗号和冒号隔开。

$upstream_status

保存服务器的响应代码。 出现多个响应时,也是以逗号和冒号隔开。

$upstream_cache_status

表示是否命中缓存, 取值范围:MISS、EXPIRED、UPDATING、STALE、HIT。

$upstream_http_ $HEADER

保存服务器的响应头的值。比如“Server”响应头的值可以通过$upstream_http_server变量来获取。 需要注意的是只有最后一个响应的头会被保留下来。

upstream调度方式

1)轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2)weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

例如:

3)ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

例如:

4)fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

5)url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

 


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (1)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!