nginx下的负载均衡(upstream)配置教程
Nginx作为一款热门的优秀的Web服务器以及反向代理服务器,除了性能强悍之外,有着不少优越的特性,异步,非阻塞,IO多路复用, 多服务器负载均衡 ,与lua完美结合等等。今天这篇文章就来聊聊nginx日(后)常(端)运(面)维(试)中经常需要处(问)理(到)的负载均衡配置。

首先我们来看一下nginx官方对于upstream模块的描述: http://nginx.org/en/docs/http/ngx_http_upstream_module.html
The ngx_http_upstream_module module is used to define groups of servers that can be referenced by the proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, and grpc_pass directives.
从nginx官方的upstream介绍描述来理解,upstream是用于定义一组服务器,并且被 proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, grpc_pass 等配置使用的,也就是大家常说的负载均衡。
upstream的配置格式如下:
upstream 服务器组的名称 { server 上游服务器的地址或IP [可选的配置参数] }
接下来是一个upstream配置样例:
upstream backend { server backend1.example.com weight=5; server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; server 127.0.0.2:8090 }
upstream server配置的前半部分很好理解,可以是域名、IP或者本地的unix sock路径,不过后半部分的可选参数的稍微有点多,下面就详细的讲解下 upstream server的配置参数。
weight
调度权重,顾名思义值越大则被调度到的几率越大,默认为1。
max_conns
限制代理服务器的最大并发活动连接数。默认值为0,表示没有限制。如果服务器组不常驻内存,则限制对每个工作进程都有效。 如果启用了idle keepalive连接、多个worker和共享内存,到代理服务器的活动和空闲连接的总数可能超过max_conns值。(PS:1.11.5版本之前的nginx这个功能是作为商业订阅的功能。)
max_fails
配合fail_timeout参数使用,最大试错值,在上游服务器出错后最大的重试次数,重试后服务器依然不可用的话则在fail_timeout设定的时间内将服务器状态设置为不可用。默认为1,0值表示禁止重试,或者由 proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, grpc_pass 等配置来定义重试的次数。
fail_timeout
出错超时时间,默认值为10。此参数的详细作用描述在max_fails中已经说明。
backup
备份服务器,设置此参数的server表示为备份服务器,当主服务器不可用时,则会调度到这台备份服务器。( PS:该参数不能与散列、ip_hash和随机负载平衡方法一起使用。 )
down
将服务器标记为永久不可用状态。
后面几个nginx商业订阅版本的功能配置,本文就不再继续阐述了,下面来介绍一下其他几个非server的upstream配置。
keepalive
连接到上游服务器的缓存(连接池)。connections参数设置到保存在每个工作进程缓存中的上游服务器的最大空闲保持连接数。当超过此数目时,最近最少使用的连接将被关闭。
配置格式:
upstream 服务器组的名称 { server 上游服务器的地址或IP [可选的配置参数] server 上游服务器的地址或IP [可选的配置参数] server 上游服务器的地址或IP [可选的配置参数] keepalive 连接池的最大数量; }
keepalive_requests
连接的最大请求数,设置通过一个keepalive连接可以服务的最大请求数。每个连接在处理完最大请求数之后的请求,则自动关闭连接。可以有效的释放链接资源,防止某些连接内存溢出,php的swoole扩展也有个类似的参数。 该参数的默认值为100,配置的格式和keepalive一样。
keepalive_timeout
设置连接池中的长连接在空闲状态下的打开的最大时间,默认为keepalive_timeout 60s。
queue
如果在处理请求时不能立即选择上游服务器,则请求将被放入队列。该参数就是设置同一时间内可以在队列中的请求的最大数量。如果队列被填满,或者在timeout参数中指定的时间段内无法选择要传递请求的服务器,则502错误将返回给客户端。
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,非商业性质可转载须署名链接,详见本站版权声明。
发表评论